Как можно переключить представление вкладки с одного на другое в JavaFx

Я делаю проект JavaFx. У меня есть табличное представление, которое заполнено несколькими именами (например, BG Manager, User Management, Find Acl, ....). Каждый раз, когда я нажимаю на каждое из этих имен (или на каждую строку этой таблицы), открывается новая вкладка, которая снова заполняется информацией, которую я изложил ранее внутри. Вот пример функции, которая вызывается, когда я нажимаю на строку с названием BG Management:

private void callBGManager(){
    try {
        Tab tab = new Tab ();
        FXMLLoader bgm = new FXMLLoader(getClass().getResource("/views/BGMWindow.fxml"));
        BGMController  bgmc = new BGMController(_session);
        bgm.setController(bgmc);
        Parent root = bgm.load();
        for (Tab tabs : TabPane1.getTabs()){
            if (tabs.getText().equals(ListView1.getSelectionModel().getSelectedItem())){
                SingleSelectionModel<Tab> selectionModel = TabPane1.getSelectionModel();
                selectionModel.select(tab);
                return;
            }
        }
        tab.setContent(root);
        tab.setText(ListView1.getSelectionModel().getSelectedItem());
        tab.closableProperty().set(true);
        TabPane1.setTabClosingPolicy(TabPane1.getTabClosingPolicy().SELECTED_TAB);
        TabPane1.getTabs().add(tab);
        SingleSelectionModel<Tab> selectionModel = TabPane1.getSelectionModel();
        selectionModel.select(tab);



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

}

Нет никаких проблем в компиляции или работе с этим кодом, так как он работает хорошо. Вот сценарий для лучшего понимания ситуации. У меня есть, скажем, 5 строк в моем списке, и каждый раз, когда я нажимаю на каждую, если она еще не открыта, она будет отображаться, а если она уже открыта, ничего не происходит. Допустим, я уже нахожусь в другой вкладке, и BG Manager уже открыт. Как я могу перейти к диспетчеру BG, когда я нажимаю на него повторно :)


person Danial Kosarifa    schedule 30.09.2016    source источник
comment
Конечно, вы просто хотите selectionModel.select(tabs) вместо selectionModel.select(tab) в цикле for? (Было бы понятнее, если бы вы переместили Tab tab = new Tab() после цикла.)   -  person James_D    schedule 30.09.2016


Ответы (1)


Здравствуйте, Даниал, вы можете использовать (row)cell.setUserData(); и по умолчанию для каждого истинного значения. И при нажатии на эту строку (ячейку) вы должны проверить эти данные (row)cell.getUserData();, и если это правда, то изменить их на ложь и открыть окно, в другом случае ничего не делать.

ПРИМЕР:

table.setRowFactory( tv -> {
  TableRow<MyType> row = new TableRow<>();
  row.setOnMouseClicked(event ->{
        boolean result = (boolean) row.getUserData();
        if(result){
            row.setUserData(false);
            //There will be your method to open new window
            methodToOpenNewWindow(row);
        }else{
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("Information");
            alert.setContentText("This entity already was opened.");
            alert.show();
        }
    });
  return row ;
});

В методе methodToOpenNewWindow при закрытии окна установите для строки userData значение true .

person Vladlen Gladis    schedule 30.09.2016