如何将其他类添加到当前阶段 - JavaFX

时间:2015-09-30 19:49:24

标签: java javafx javafx-8

我有javafx应用程序显示一些信息。

我是javafx的新手,在尝试进行一些测试时试图理解它。

我想在应用程序之上添加时钟,我找到next source

如何在同一屏幕(屏幕顶部)上将此时钟(从源)添加到当前应用程序?我的应用程序使用main.java上的下一个代码(我也使用FXML文件并通过“场景”构建器进行编辑):

package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import net.sourceforge.zmanim.hebrewcalendar.JewishCalendar;
import net.sourceforge.zmanim.hebrewcalendar.HebrewDateFormatter;
import net.sourceforge.zmanim.hebrewcalendar.JewishCalendar;
import net.sourceforge.zmanim.util.GeoLocation;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Label lblShabat = (Label) root.lookup("#shabat");
        Label lbldateHeb = (Label) root.lookup("#dateHeb");

        JewishCalendar israelCalendar = new JewishCalendar();
        israelCalendar.setInIsrael(true); //set the calendar to Israel
        JewishCalendar chutsLaaretzCalendar = new JewishCalendar();
        chutsLaaretzCalendar.setInIsrael(false); //not really needed since the API defaults to false
        JewishCalendar jd = new JewishCalendar();
        HebrewDateFormatter hdf = new HebrewDateFormatter();
        hdf.setHebrewFormat(true);

        for(int i = 0; i < 14; i++){
            israelCalendar.forward(); //roll the date forward a day
            //  chutsLaaretzCalendar.forward(); //roll the date forward a day
            if(israelCalendar.getDayOfWeek() == 7){ //ignore weekdays
                if (lblShabat!=null) lblShabat.setText(hdf.formatYomTov(jd)); //hdf.formatParsha(israelCalendar)
                //hdf.formatYomTov(jd)
            }
        }
        String cholHamoedSuccos = "חול המועד סוכות";
        if(hdf.formatYomTov(jd) == cholHamoedSuccos) {
            String image = Main.class.getResource("Dollarphotoclub_91486993.jpg").toExternalForm();
            root.setStyle("-fx-background-image: url('" + image + "'); " +
                    "-fx-background-position: center center; " +
                    "-fx-background-repeat: stretch;");

        }
        if (lbldateHeb!=null) lbldateHeb.setText(hdf.format(jd));

        primaryStage.setTitle("Hello World");

        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.setFullScreen(true);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

2 个答案:

答案 0 :(得分:1)

TheStageOfthesource.getScene().getRoot();//will give you the root pane

就是你想要的?然后将其添加到Pane

答案 1 :(得分:1)

也许有一种更好的方法不需要那么多的重构,但我重构了Clock,所以函数createLayout()与Clock的start()函数分开。在SceneBuilder中添加一个子场景,您可以在其中放置时钟并为其设置ID,我使用了node file.js --data { "name": "Dave" }。在控制器中,initialize()函数创建布局并将clocksubscene的根设置为布局。还将clock.css添加到主场景的样式中。

Refactored Clock.java(省略的部分未更改):

clocksubscene

新的Controller初始化代码:

public void start(final Stage stage) throws Exception {

    Parent layout = createLayout();
    final Scene scene = new Scene(layout, Color.TRANSPARENT);
    scene.getStylesheets().add(getResource("clock.css"));

    // show the scene.
    stage.initStyle(StageStyle.TRANSPARENT);
    stage.setScene(scene);
    stage.show();
}

public Parent createLayout() {
    // construct the analogueClock pieces.
    final Circle face = new Circle(100, 100, 100);
    face.setId("face");
    final Label brand = new Label("Splotch");
    brand.setId("brand");
    brand.layoutXProperty().bind(face.centerXProperty().subtract(brand.widthProperty().divide(2)));
    brand.layoutYProperty().bind(face.centerYProperty().add(face.radiusProperty().divide(2)));
    final Line hourHand = new Line(0, 0, 0, -50);
    hourHand.setTranslateX(100);
    hourHand.setTranslateY(100);
    hourHand.setId("hourHand");
    final Line minuteHand = new Line(0, 0, 0, -75);
    minuteHand.setTranslateX(100);
    minuteHand.setTranslateY(100);
    minuteHand.setId("minuteHand");
    final Line secondHand = new Line(0, 15, 0, -88);
    secondHand.setTranslateX(100);
    secondHand.setTranslateY(100);
    secondHand.setId("secondHand");
    final Circle spindle = new Circle(100, 100, 5);
    spindle.setId("spindle");
    Group ticks = new Group();
    for (int i = 0; i < 12; i++) {
        Line tick = new Line(0, -83, 0, -93);
        tick.setTranslateX(100);
        tick.setTranslateY(100);
        tick.getStyleClass().add("tick");
        tick.getTransforms().add(new Rotate(i * (360 / 12)));
        ticks.getChildren().add(tick);
    }
    final Group analogueClock = new Group(face, brand, ticks, spindle, hourHand, minuteHand, secondHand);

    // construct the digitalClock pieces.
    final Label digitalClock = new Label();
    digitalClock.setId("digitalClock");

    // determine the starting time.
    Calendar calendar = GregorianCalendar.getInstance();
    final double seedSecondDegrees = calendar.get(Calendar.SECOND) * (360 / 60);
    final double seedMinuteDegrees = (calendar.get(Calendar.MINUTE) + seedSecondDegrees / 360.0) * (360 / 60);
    final double seedHourDegrees = (calendar.get(Calendar.HOUR) + seedMinuteDegrees / 360.0) * (360 / 12);

    // define rotations to map the analogueClock to the current time.
    final Rotate hourRotate = new Rotate(seedHourDegrees);
    final Rotate minuteRotate = new Rotate(seedMinuteDegrees);
    final Rotate secondRotate = new Rotate(seedSecondDegrees);
    hourHand.getTransforms().add(hourRotate);
    minuteHand.getTransforms().add(minuteRotate);
    secondHand.getTransforms().add(secondRotate);

    // the hour hand rotates twice a day.
    final Timeline hourTime = new Timeline(
            new KeyFrame(
                    Duration.hours(12),
                    new KeyValue(
                            hourRotate.angleProperty(),
                            360 + seedHourDegrees,
                            Interpolator.LINEAR
                    )
            )
    );

    // the minute hand rotates once an hour.
    final Timeline minuteTime = new Timeline(
            new KeyFrame(
                    Duration.minutes(60),
                    new KeyValue(
                            minuteRotate.angleProperty(),
                            360 + seedMinuteDegrees,
                            Interpolator.LINEAR
                    )
            )
    );

    // move second hand rotates once a minute.
    final Timeline secondTime = new Timeline(
            new KeyFrame(
                    Duration.seconds(60),
                    new KeyValue(
                            secondRotate.angleProperty(),
                            360 + seedSecondDegrees,
                            Interpolator.LINEAR
                    )
            )
    );

    // the digital clock updates once a second.
    final Timeline digitalTime = new Timeline(
            new KeyFrame(Duration.seconds(0),
                    new EventHandler<ActionEvent>() {
                        @Override
                        public void handle(ActionEvent actionEvent) {
                            Calendar calendar = GregorianCalendar.getInstance();
                            String hourString = pad(2, '0', calendar.get(Calendar.HOUR) == 0 ? "12" : calendar.get(Calendar.HOUR) + "");
                            String minuteString = pad(2, '0', calendar.get(Calendar.MINUTE) + "");
                            String secondString = pad(2, '0', calendar.get(Calendar.SECOND) + "");
                            String ampmString = calendar.get(Calendar.AM_PM) == Calendar.AM ? "AM" : "PM";
                            digitalClock.setText(hourString + ":" + minuteString + ":" + secondString + " " + ampmString);
                        }
                    }
            ),
            new KeyFrame(Duration.seconds(1))
    );

    // time never ends.
    hourTime.setCycleCount(Animation.INDEFINITE);
    minuteTime.setCycleCount(Animation.INDEFINITE);
    secondTime.setCycleCount(Animation.INDEFINITE);
    digitalTime.setCycleCount(Animation.INDEFINITE);

    // start the analogueClock.
    digitalTime.play();
    secondTime.play();
    minuteTime.play();
    hourTime.play();



    // add a glow effect whenever the mouse is positioned over the clock.
    final Glow glow = new Glow();
    analogueClock.setOnMouseEntered(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            analogueClock.setEffect(glow);
        }
    });
    analogueClock.setOnMouseExited(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            analogueClock.setEffect(null);
        }
    });

    // layout the scene.
    final VBox layout = new VBox();
    layout.getChildren().addAll(analogueClock, digitalClock);
    layout.setAlignment(Pos.CENTER);
    return layout;
}

在主开始例行程序中:

@Override
public void initialize(URL url, ResourceBundle rb) {
    Clock clock = new Clock();
    clocksubscene.setRoot(clock.createLayout());
}