【问题标题】:JavaFX, leaving and entering Tab controlJavaFX,离开和进入Tab控件
【发布时间】:2015-05-26 13:38:49
【问题描述】:

我有一个 JavaFX 应用程序。主窗口由一个 TabPane (P1) 组成。 P1 包含 4 个不同的 Tab 控件(T11、T12、T13、T14)。 T11 包含一个 TabPane (P2),其中包含两个 Tab 控件(T21、T22)。

我正在寻找一种简单的方法来检测任何选项卡控件获得或失去可见性。使用 SelectionModel 事件是不够的。

//lg

【问题讨论】:

  • 为什么使用选择模型事件还不够?这(和/或每个选项卡的selectedProperty)应该为您提供所需的所有信息。
  • 好吧,我不能让它工作。例如,问题是从 T12 到 T11。我可以检测到这一点。但是,P2 不会为 T21 或 T22 触发任何事件。当然,我可以检测到哪些 T21 或 T22 是可见的并手动调用一个函数,但是我的代码变得混乱。我正在寻找更好的方法?

标签: javafx


【解决方案1】:

您可以观察每个标签的selectedProperty。对于 T21 和 T22,我想你真的很想知道 T21 和 T11 是否都被选中以知道 T21 是否可见;为此,您只需观察t11.selectedProperty().and(t21.selectedProperty()):即您可以执行类似的操作

t11.selectedProperty().and(t21.selectedProperty()).addListener(...);

并提供ChangeListener<Boolean>。当且仅当同时选择 t11 和 t12 时,这将是 true,并且如果它从 false 更改为 true 或反之亦然,则会通知侦听器。

这是一个使用 FXML 的完整示例。

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class TabSelectionDemo extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        primaryStage.setScene(new Scene(FXMLLoader.load(getClass().getResource("TabSelectionDemo.fxml")), 600, 400));
        primaryStage.show();
    }

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

TabSelectionDemo.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.Label?>

<TabPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="TabSelectionDemoController" fx:id="p1">
    <Tab fx:id="t11" text="T11">
        <TabPane fx:id="p2">
            <Tab fx:id="t21" text="T21">
                <Label text="This is T21"/>
            </Tab>
            <Tab fx:id="t22" text="T22">
                <Label text="This is T22"/>
            </Tab>
        </TabPane>
    </Tab>
    <Tab fx:id="t12" text="T12">
        <Label text="This is T12"/>
    </Tab>
    <Tab fx:id="t13" text="T13">
        <Label text="This is T13"/>
    </Tab>
    <Tab fx:id="t14" text="T14">
        <Label text="This is T14"/>
    </Tab>
</TabPane>

TabSelectionDemoController.java:

import javafx.beans.binding.BooleanBinding;
import javafx.beans.value.ChangeListener;
import javafx.fxml.FXML;
import javafx.scene.control.Tab;


public class TabSelectionDemoController {
    @FXML
    private Tab t11 ;
    @FXML
    private Tab t12 ;
    @FXML
    private Tab t13 ;
    @FXML
    private Tab t14 ;
    @FXML
    private Tab t21 ;
    @FXML
    private Tab t22 ;

    private BooleanBinding t21Selected ;
    private BooleanBinding t22Selected ;

    public void initialize() {
        t11.selectedProperty().addListener(createListener("t11"));
        t12.selectedProperty().addListener(createListener("t12"));
        t13.selectedProperty().addListener(createListener("t13"));
        t14.selectedProperty().addListener(createListener("t14"));

        t21Selected = t21.selectedProperty().and(t11.selectedProperty()) ;
        t22Selected = t22.selectedProperty().and(t11.selectedProperty()) ;

        t21Selected.addListener(createListener("t21"));
        t22Selected.addListener(createListener("t22"));
    }

    private ChangeListener<Boolean> createListener(String tabName) {
        return (obs, wasSelected, isNowSelected) -> {
            if (isNowSelected) {
                System.out.println(tabName + " gained visible selection");
            } else {
                System.out.println(tabName + " lost visible selection");
            }
        };
    }

}

【讨论】:

  • 我确实试过这个," t11.selectedProperty().and(t21.selectedProperty()).addListener(...);"但它永远不会触发我。你测试过你的代码吗?
  • 是的:运行良好。上面的代码你运行了吗?也许我不明白你想做什么。更新以在示例中添加该显式代码。
  • 你理解我很好。我的代码和您的代码之间的差异是您创建选项卡的方式。我使用了scenebuilder,可能会有所不同?
  • 我怀疑这个问题与你当时做错了什么完全无关。创建并发布MCVE
  • 它也适用于 FXML(无论如何这两种方法之间确实没有区别)。我更新了示例以使用 FXML 创建的选项卡,而不是在 Java 中创建的选项卡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2015-09-05
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多