20

我正在尝试为大型复杂 gui 构建骨架,因此想法是在 javafx 2.1 中使用类似 mvc 的样式制作所有内容,因此每个组件都有一个 fxml 文件,如果需要,还有 css、控制器和模型。我试图弄清楚如何更改子场景(运行时的子 fxml)。有人知道怎么做吗?我有点坚持这一点。可能是蜜蜂添加MainViewController?场景:用户点击任务栏中的按钮,包含的 content1.fxml 将被替换为 content2.fxml

这里是基本代码

主应用程序.java

Loads the MainView.fxml

主视图.fxml

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>


 <BorderPane xmlns:fx="http://javafx.com/fxml">
<center>
    <fx:include source="Content1.fxml"/>
</center>

<bottom>
    <fx:include source="TaskBar.fxml"/>
</bottom>

</BorderPane>

内容1.fxml

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<StackPane xmlns:fx="http://javafx.com/fxml" fx:id="content1">
    <Label text="Hallo Java FX 2.1.1 Content1.fxml"/>
</StackPane>

内容2.fxml

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<StackPane xmlns:fx="http://javafx.com/fxml" fx:id="content2">
    <Label text="Hallo Java FX 2.1.1 Content2.fxml"/>
</StackPane>

任务栏.fxml

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<HBox xmlns:fx="http://javafx.com/fxml" spacing="10" alignment="center" 
     fx:id="taskBar" fx:controller="TaskBarController">
    <children>
        <Button fx:id="taskBarButton1" onAction="#handleTaskBarButton1Action"/>     
        <Button fx:id="taskBarButton2" onAction="#handleTaskBarButton2Action"/> 
    </children>
</HBox>

任务栏控制器.java

import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;

public class TaskBarController implements Initializable {

// Binding with the FXML
@FXML
private Button taskBarButton1;

@FXML
private Button taskBarButton2;

@FXML
private void handleTaskBarButton1Action(ActionEvent event) {
    System.out.println("click! taskBarButton1");
}

@FXML
private void handleTaskBarButton2Action(ActionEvent event) {
    System.out.println("click! taskBarButton2");
}

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub

}

}
4

2 回答 2

24

不要只包含 fxml,为此创建一个业务逻辑层:

<BorderPane xmlns:fx="http://javafx.com/fxml">
<center>
    <Pane fx:id="content"/>
</center>

并在按钮单击处理程序中更新它:

@FXML
private void handleTaskBarButton2Action(ActionEvent event) {
   System.out.println("click! taskBarButton2");
   content.getChildren().clear();
   content.getChildren().add(FXMLLoader.load(getClass().getResource("Content2.fxml"));
}
于 2012-07-19T16:53:29.403 回答
2

它可以工作,谢谢帮助,但我被迫删除 TaskBar.fxml 和 TaskBarController.java ,编写了一个带有 @FXML 句柄的 MainViewController 和带有 fx:id="content" 的按钮和窗格的 @FXML ,然后把我的MainView.fxml 中的海关按钮

@FXML
private void handleTaskBarButton2Action(ActionEvent event) throws IOException {
    System.out.println("click! taskBarButton2");
    content.getChildren().clear();
    content.getChildren().add((Node) FXMLLoader.load(getClass().getResource("Content2.fxml")));
}
于 2012-07-22T18:07:22.323 回答