当前位置: 首页 > 知识库问答 >
问题:

JavaFX TabPane选项卡从外部控制器选择

郎刚捷
2023-03-14

Main.java

public class Main extends Application {

public static void main(String[] args) {
    launch(args);
}
@Override
public void start(Stage primaryStage){
        Controller1 controller1 = new Controller1();
        controller1.showStage();
  }
}

Controller1.java

public class Controller1{

    private final Stage thisStage;
    private Controller2 controller2 = new Controller2(this);

    public Controller1() {
    thisStage = new Stage();

    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Steuerung.fxml"));
        loader.setController(this);
        thisStage.setScene(new Scene(loader.load()));
        thisStage.setTitle("Steuerung");
    }catch (IOException e){
        e.printStackTrace();
     }
    }

    public void showStage(){ thisStage.show();}

    @FXML private void initialize() {
        b_AnzeigeÖffnen.setOnAction(e -> openAnzeige());
        b_Ecke.setOnMouseClicked(e -> controller2.setTab(2));
    }

    private void openAnzeige(){
        Controller2 controller2 = new Controller2(this);
        controller2.showStage();
    }

    @FXML
    private Label b_Ecke;

    @FXML
    private MenuItem b_AnzeigeÖffnen

}

Controller2.java

public class Controller2 {

private Stage thisStage;

private final Controller1 controller1;

public Controller2(Controller1 controller1) {
    this.controller1 = controller1;
    thisStage = new Stage();
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Anzeige.fxml"));
        loader.setController(this);
        thisStage.setScene(new Scene(loader.load()));
        thisStage.setTitle("Spielstand");

        }catch (IOException e){
            e.printStackTrace();
        }
}

public void showStage() { thisStage.show();}


@FXML
private TabPane TP_A;

@FXML
private Tab tA_Home;

@FXML
private Tab tA_EckePreview;

@FXML
private Tab tA_EckVerhältnis;

@FXML
private Tab tA_Spielverlauf;

@FXML
private Tab tA_Spielstatistik;

@FXML
private Tab tA_GelbeKarte;

@FXML
private Tab tA_RoteKarte;

@FXML
private Tab tA_Elfmeter;

@FXML
private Tab tA_Auswechselung;


@FXML public void setTab(Integer i) {
   System.out.println("TABSWITCH");
    switch(i) {
        case 1: TP_A.getSelectionModel().select(tA_Home); break;
        case 2: TP_A.getSelectionModel().select(tA_EckePreview); break;
        case 3: TP_A.getSelectionModel().select(tA_EckVerhältnis); break;
        case 4: TP_A.getSelectionModel().select(tA_Spielverlauf); break;
        case 5: TP_A.getSelectionModel().select(tA_Spielstatistik); break;
        case 6: TP_A.getSelectionModel().select(tA_GelbeKarte); break;
        case 7: TP_A.getSelectionModel().select(tA_RoteKarte); break;
        case 8: TP_A.getSelectionModel().select(tA_Elfmeter); break;
        case 9: TP_A.getSelectionModel().select(tA_Auswechselung); break;
        //case 10: TP_A.getSelectionModel().select(tA_Nachspielzeit/Verlängerung); break; -> TODO
        default: System.out.println("Fehler: Tab in TP_A nicht vorhanden!"); break;
        }
    }
}

谢谢你的忠告!

编辑:语法

共有1个答案

佘缪文
2023-03-14

controller1中,您将controller2实例创建为实例变量:

private Controller2 controller2 = new Controller2(this);

当用户单击b_ecke标签时,您将更改该实例中的选项卡:

b_Ecke.setOnMouseClicked(e -> controller2.setTab(2));

但是,在代码中没有任何地方可以在Controller2的实例上调用ShowStage,因此您正在更改未显示内容中的选项卡选择。

b_AnzeigeÖffnen.setOnAction(e -> openAnzeige());

private void openAnzeige(){
    Controller2 controller2 = new Controller2(this);
    controller2.showStage();
}
b_AnzeigeÖffnen.setOnAction(e -> openAnzeige());

private void openAnzeige(){
    // Controller2 controller2 = new Controller2(this);
    controller2.showStage();
}
 类似资料:
  • 问题内容: 我有一个常规的Twitter Bootstrap 3标签。我要做的就是控制 一个元素来控制多个容器。 在此示例中,当我更改标签时,仅第一个被更改。我要两个容器都改变,而不仅仅是第一个。 谢谢! 问题答案: 我将 data-target 属性添加到a元素并更改第二个tab内容中的id 我修改了这行 您的: 我的更新: 第二个选项卡内容,您的: 我的更新:

  • 当我像下面的例子一样点击选项卡2时,我如何将选项卡1 Neumorphic css翻译成选项卡2呢,就像从选项卡1滑到选项卡2一样? https://dribble.com/shots/10805627-neumorphic-tab

  • 我有一个简单的应用程序,将加载托管的网页,我想显示在单独的选项卡面板。最干净的方法是什么?选项卡可以在用户点击每个选项卡时加载,或者在应用程序启动时一次加载所有选项卡。Sencha Touch没有办法简单地使html: value成为一个URL。我可以为每个选项卡添加一些页面加载事件吗? [更新] 我添加了使用本地html文件进行测试的初始化:方法中的Ajax调用的建议。但是,所有选项卡都显示要完

  • 问题内容: 我有一个带有3个不同内容选项卡的Bootstrap“选项卡”导航。除了我要从选项卡导航之外链接到其中一个选项卡之外,它的工作原理都是完美的。这意味着当某人单击选项卡窗口外部的链接时,应将其设置为“活动”该选项卡并显示其内容。 现在,它正确显示了该选项卡的内容,但是该选项卡未设置为“活动”。我如何实现这一点,以使其像有人单击一样“活跃”? 这是代码: 非常感谢您的帮助或提示:) 问题答案

  • 我对管理员后端的自定义控制器ACL有问题。我读了,重读了,检查了。。。。还是找不到我的问题。该死。 首先,代码。。。模块本身正在工作。。。我有积木,助手,前端控制器。。。系统- 我的后端选项卡显示,但网址(admin/mynew模块/index,admin/mynew模块/list)转到404页面。 config.xml,管理路由器: Adminhtml。xml、后端选项卡和acl 管理员管理员

  • 我想问你一个问题。我使用Liferay 6.2。我有一个自定义portlet,它嵌入在我的自定义主题中 下面是Liferay portlet的一些设置。xml 在portlet控制器呈现方法中,我设置了portlet首选项(我想使我的portlet无边界) 但当我检查Liferay和我的自定义嵌入portlet边框时,会发现。但PORTLETPREFERENCE表有一行,下面是首选项,ID根据li