JavaFx: TabPane và Tab

dungapatit

New Member
5/7/19
2
0
1
31
chào các bạn. mình đang làm về javafx với tabpane
đề bài là có 1 menu bên phải và 1 tabpane bên trái, khi click vào từng menu bên trái thì sẽ append 1 tab vào tabpane bên phải
mình đang gặp vấn đề: khi mà load file fxml tab vào tabpane thì file đó không sửa bằng JavaFX Scene Builder được ( thông báo: content of this document cannot be displayed)
đây là file Main.java
Java:
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("/view/Home.fxml"));
            primaryStage.setTitle("TabPane Example");
            primaryStage.setScene(new Scene(root));
//            primaryStage.setFullScreen(true);
            primaryStage.setMaximized(true);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
   
    public static void main(String[] args) {
        launch(args);
    }
}
còn đây là file HomeController.java
Java:
public class HomeController {

    private Map<String, Tab> openTabs = new HashMap<>();
    @FXML
    private TabPane tabPane;
    @FXML
    Button btnSearch, btnUpdate;

    public void initialize(URL location, ResourceBundle resources) {
        btnUpdate.setOnAction(e -> openTab("/view/Update.fxml"));
        btnSearch.setOnAction(e -> openTab("/view/Search.fxml"));
    }

    private void openTab(String fxmlFile) {
        if (openTabs.containsKey(fxmlFile)) {
            tabPane.getSelectionModel().select(openTabs.get(fxmlFile));
        } else {
            try {
                Tab myNewTab = FXMLLoader.load(getClass().getResource(fxmlFile));
                tabPane.getTabs().add(myNewTab);
                openTabs.put(fxmlFile, myNewTab);
                myNewTab.setOnClosed(e -> openTabs.remove(fxmlFile));
                tabPane.getSelectionModel().select(myNewTab);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }

    @FXML
    private void actionUpdate() throws IOException {
        openTab("/view/Update.fxml");
    }

    @FXML
    private void actionSearch() throws IOException {
        openTab("/view/Search.fxml");
    }

}
Còn đây là Home.fxml
XML:
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity"
    minHeight="-Infinity" minWidth="-Infinity" prefHeight="466.0"
    prefWidth="641.0" xmlns="http://javafx.com/javafx/8"
    xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="controllers.HomeController">
    <children>
        <Pane prefHeight="466.0" prefWidth="200.0"
            style="-fx-background-color: #374;">
            <children>
                <Pane layoutY="266.0" prefHeight="200.0" prefWidth="200.0">
                    <children>
                        <Button fx:id="btnSearch" layoutX="-1.0" layoutY="2.0"
                            mnemonicParsing="false" onAction="#actionSearch"
                            prefHeight="31.0" prefWidth="200.0" text="Tìm kiếm">
                            <padding>
                                <Insets right="2.0" />
                            </padding>
                            <opaqueInsets>
                                <Insets />
                            </opaqueInsets>
                        </Button>
                        <Button fx:id="btnUpdate" layoutX="-1.0" layoutY="33.0"
                            mnemonicParsing="false" onAction="#actionUpdate"
                            prefHeight="31.0" prefWidth="200.0" text="Cập nhật">
                            <padding>
                                <Insets right="2.0" />
                            </padding>
                        </Button>
                    </children>
                </Pane>
            </children>
        </Pane>
        <TabPane fx:id="tabPane" layoutX="200.0" prefHeight="466.0" prefWidth="442.0"
            tabClosingPolicy="SELECTED_TAB">

        </TabPane>
    </children>
</AnchorPane>
đây là file Search.fxml
XML:
<Tab fx:id="tabSearch" text="Tim kiem"
    xmlns="http://javafx.com/javafx/8.0.60"
    xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="controllers.SearchController">
    <Label text=" This is Search Page " translateX="10"></Label>
</Tab>
đây là file Update.fxml
XML:
<Tab fx:id="tabSearch" text="Tim kiem"
    xmlns="http://javafx.com/javafx/8.0.60"
    xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="controllers.SearchController">
    <Label text=" This is Search Page " translateX="10"></Label>
</Tab>
Capture.PNG
Mong muốn là khi append 2 tab là update và search vào tabpane thì có thể mở bằng JavaFX Scene Builder để kéo thả được ạ
cảm ơn các b.
dưới đây là source code.
 

Attachments

Sửa lần cuối:

Thanhpv

New Member
30/3/18
28
6
3
Mình không thử chạy code của bạn nhưng trong file FXML của bạn có thành phần dễ gây rắc rối nếu dùng SceneBuilder đó là:
Code:
fx:controller="controllers.SearchController"
Lý do bạn không nêt set controller trong file FXML vì SceneBuilder sẽ resolve libs của SceneBuilder và không tìm thấy class được định nghĩa bởi người dùng. Rất có thể đây là nguyên nhân bạn chạy được code nhưng SceneBuilder thì không mở được.

Mình nghĩ bạn nên chuyển các thành phần "dễ biến đổi" bởi người dùng ra khỏi FXML để SceneBuilder "đỡ phải vất vả". Và wire nó bằng FXMLLoader trong java class file.