访问从TabPane返回的Tab中的JavaFX TextArea

时间:2018-07-25 23:17:36

标签: java javafx javafx-8

我想访问位于选项卡内的文本区域。 TabPane中的所有选项卡都将具有TextArea。不幸的是,Tab不是接口,并且似乎没有办法改变TabPane内保存的类型,因此我看不到一种使代码知道通用选项卡内没有单独的TextArea的方法。他们在外面某个地方的清单。 TabPane只能返回一个Tab,而Tab不能区分它是否拥有TextArea,即使我扩展Tab并将其提供给TabPane,它也仍然只会返回Tab。保留外部列表似乎确实很麻烦,我不认为这将是预期的设计。所以我在这里想念什么。我没有使用FXML。

1 个答案:

答案 0 :(得分:-1)

您可以创建自己的Tab扩展名,其内容为TextArea,并为其提供getTextArea()方法。

这样,您可以知道每个Tab都有一个TextArea,并且可以根据需要进行操作。

下面是一个简单的应用程序,用于演示:

import javafx.application.Application;

import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        // Simple UI
        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));

        // Create the TabPane
        TabPane tabPane = new TabPane();

        // Create some TextAreaTabs to put into the TabPane
        tabPane.getTabs().addAll(
                new TextAreaTab("Tab 1", "This is tab 1!"),
                new TextAreaTab("Tab 2", "This is tab 2!"),
                new TextAreaTab("Tab 3", "This is tab 3!")
        );

        // A button to get the text from each tab
        Button button = new Button("Print Text");

        // Set the action for the button to loop through all the tabs in the TabPane and print the contents of its TextArea
        button.setOnAction(e -> {
            for (Tab tab : tabPane.getTabs()) {

                // You'll need to cast the Tab to a TextAreaTab in order to access the getTextArea() method
                System.out.println(tab.getText() + ": " +
                        ((TextAreaTab) tab).getTextArea().getText());
            }
        });

        // Add the TabPane and button to the root layout
        root.getChildren().addAll(tabPane, button);

        // Show the stage
        primaryStage.setScene(new Scene(root));
        primaryStage.setWidth(300);
        primaryStage.setHeight(300);
        primaryStage.show();
    }
}
// This is the custom Tab that allows you to set its content to a TextArea
class TextAreaTab extends Tab {

    private TextArea textArea = new TextArea();

    public TextAreaTab(String tabTitle, String textAreaContent) {

        // Create the tab with the title provided
        super(tabTitle);

        // Set the Tab to be unclosable
        setClosable(false);

        // Set the text for the TextArea
        textArea.setText(textAreaContent);

        // Set the TextArea as the content of this tab
        setContent(textArea);

    }

    public TextArea getTextArea() {
        return textArea;
    }
}

一个更简单的选择是将循环中的每个getContent()的{​​{1}}方法强制转换为Tab

TextArea

我发现第一个选项更具可读性和灵活性,因为您可以将所有选项卡配置为在一个位置内相同。