在舞台上调用另一个FXML

时间:2014-01-13 12:29:23

标签: javafx fxml

我知道这个问题已有答案,但不知何故,它无法解决我的问题。

当我单击IMAGE1中的文本字段时,我希望键盘FXML(IMAGE2)在IMAGE3中显示。但问题是,我似乎无法找到解决方案。我该怎么做?

我需要你的帮助。

IMAGE1

enter image description here

IMAGE2

enter image description here

的Image3

enter image description here

2 个答案:

答案 0 :(得分:0)

我正在尝试类似的东西,这是我想出的(许多可能的解决方案之一):

您需要将主要布局(IMAGE1)包装在StackPane中。它的用法是覆盖需要覆盖的内容(在你的情况下是键盘)。键盘放在另一个窗格中(以下示例中为VBox)。 VBox

  • 放置在<{1>} 之后主要布局位于其上方
  • 被赋予最大高度,因此它不会填满整个窗口
  • StackPane等于身高
  • 和底部对齐

相关代码n FXML:

translateY

这将永远在视图之外。切换键盘需要2 <VBox fx:id="statusContainer" maxHeight="100.0" prefHeight="100.0" translateY="100.0" StackPane.alignment="BOTTOM_LEFT" /> s(可以用1完成,我想知道吗?),一个用于向上移动键盘,一个向下移动。

示例代码:

1)Java:

TranslateTransition

2)FXML(称之为import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javafx.animation.TranslateTransition; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.util.Duration; public class Test1 extends Application { @FXML private VBox statusContainer; private TranslateTransition showStatus; private TranslateTransition hideStatus; boolean showsStatus = false; @Override public void start(Stage primaryStage) { try { StackPane page = (StackPane) FXMLLoader.load(this.getClass().getResource("test1.fxml")); Scene scene = new Scene(page); primaryStage.setTitle(this.getClass().getName()); primaryStage.setScene(scene); primaryStage.sizeToScene(); primaryStage.show(); } catch (IOException e) { Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, e); } } @FXML void initialize() { showStatus = new TranslateTransition(Duration.millis(250), statusContainer); showStatus.setByY(-100.0); showStatus.setOnFinished(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { showsStatus = true; } }); hideStatus = new TranslateTransition(Duration.millis(250), statusContainer); hideStatus.setByY(100.0); hideStatus.setOnFinished(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { showsStatus = false; } }); } public void toggleStatus() { if( showsStatus ) { showStatus.stop(); hideStatus.play(); } else { hideStatus.stop(); showStatus.play(); } } public static void main(String[] args) { launch(args); } } 以匹配代码):

test1.fxml

3)<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.net.*?> <?import java.util.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.paint.*?> <StackPane id="StackPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="fancymsg.FancyMsg1"> <children> <AnchorPane prefHeight="200.0" prefWidth="200.0"> <children> <Button mnemonicParsing="false" onAction="#toggleStatus" text="Status" AnchorPane.leftAnchor="50.0" AnchorPane.topAnchor="100.0" /> </children> </AnchorPane> <VBox fx:id="statusContainer" maxHeight="100.0" prefHeight="100.0" translateY="100.0" StackPane.alignment="BOTTOM_LEFT" /> </children> <stylesheets> <URL value="@test1.css" /> </stylesheets> </StackPane> 突出的CSS(称之为VBox):

test1.css

答案 1 :(得分:0)

answer的mcve版本 可以找到here

enter image description here