Как я могу закрыть вкладку Javafx 2.2 при нажатии кнопки сохранения/отмены внутри нее?

У меня есть проект JavaFX 2.2, который использует Tabpane для динамического открытия/закрытия вкладок. Я хочу закрыть вкладку, когда я нажимаю на нее кнопку «Сохранить/закрыть».

Является ли это возможным?

Хотя я мог бы легко получить ответ, но должен сказать, что это проект fxml Javafx 2.2, в котором участвуют 3 класса, основной класс, mainclassController и tabcontroller, например:

"основной" = принципал.java

public Tab abaUsuario(String nome) {

    try{
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(Principal.class.getResource("controls/novoUsuarioForm.fxml"));
    AnchorPane novoUsuario = (AnchorPane) loader.load();
    //UsuarioDAO usrDAO = new UsuarioDAO();
    //Usuario usr = new Usuario();

    NovoUsuarioFormController nvu = new NovoUsuarioFormController();
    nvu.setMainApp(this);    

    Tab t = new Tab(nome);
    t.setContent(novoUsuario);        
    return t;
}catch (IOException ex ) {
        Dialogs.showErrorDialog(primaryStage, ex.getMessage() , "Erro ao inserir Usuário", "JANELA DE ERRO");
        //ex.getCause().printStackTrace();
    }
    return null;}

 public void closeTab(){
    baseWindowcontroller.closeUsuarioTab();

}

"mainController" = baseWindowController.java

@FXML
private void handleNovoUsuário(){       

    novoUsuarioTab = prime.abaUsuario("Novo usuario");
    novoUsuarioTab.setClosable(true);
   //  int numtab = tab_base.getTabs().size();
    // System.out.println(numtab);
     tab_base.getTabs().add(novoUsuarioTab);          
     tab_base.getSelectionModel().selectLast();

     //numtab = tab_base.getTabs().size();                
}
public void  closeUsuarioTab(){
  // if (tab_base.getSelectionModel().isEmpty()){
           // tab_base.getTabs().removeAll(novoUsuarioTab);
           // tab_base.getTabs().remove(1);
           //tab_base.getTabs().remove(novoUsuarioTab);
  // }
  Platform.runLater(new Runnable() {
        @Override public void run() {
            tab_base.getTabs().remove( tab_base.getSelectionModel().getSelectedIndex()); 
        }  
   });      
}  

И

"tabController" = Ньюусерформконтроллер.java

 @FXML private void handlebtCancelar(){  
           prime.closeTab();} 

премьер = основной

Я установил Principal.java в качестве основного приложения для контроллеров.

Как видите, я испробовал много возможностей.


person Ronaldo Linspinho    schedule 24.06.2015    source источник


Ответы (2)


Вы можете предположить, что кнопка будет нажата на текущей активной вкладке, поэтому закройте эту активную вкладку. Выполнить действие кнопки:

tabPane.getTabs().remove( tabPane.getSelectionModel().getSelectedIndex() );

Изменить:
Это не работает, потому что вы не используете контроллер, созданный FXMLLoader, ваш метод abaUsuario() должен быть

public Tab abaUsuario( String nome )
{
    try
    {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation( Principal.class.getResource( "controls/novoUsuarioForm.fxml" ) );
        AnchorPane novoUsuario = ( AnchorPane ) loader.load();
        //UsuarioDAO usrDAO = new UsuarioDAO();
        //Usuario usr = new Usuario();

        // NovoUsuarioFormController nvu = new NovoUsuarioFormController();

        NovoUsuarioFormController nvu = (NovoUsuarioFormController) loader.getController();
        nvu.setMainApp( this );

        Tab t = new Tab( nome );
        t.setContent( novoUsuario );
        return t;
    }
    catch ( IOException ex )
    {
        Dialogs.showErrorDialog( primaryStage, ex.getMessage(), "Erro ao inserir Usuário", "JANELA DE ERRO" );
        //ex.getCause().printStackTrace();
    }
    return null;
}

Также вам не нужно делать Platform.runLater() при закрытии вкладки.

person Uluk Biy    schedule 24.06.2015
comment
@RonaldoLinspinho, смотрите обновление. Если он все еще не работает, опишите эту неработающую проблему более подробно. - person Uluk Biy; 25.06.2015
comment
Небольшая ошибка может привести к тому, что мы испортим код. Благодарю вас! - person Ronaldo Linspinho; 25.06.2015

Вы можете удалить текущую вкладку из ObservableList<Tab> в TabPane при действии кнопки Save/Cancel.

MCVE:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.StackPane;
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) throws Exception {
        TabPane tabPane = new TabPane();

        for(int i=1;i<=5;i++) {
            Tab tab = new Tab("Tab " + i);
            Button button = new Button("Close Current Tab");
            button.setOnAction(e -> tabPane.getTabs().remove(tab));
            tab.setContent(new StackPane(button));
            tabPane.getTabs().add(tab);
        }

        VBox container  = new VBox(tabPane);
        tabPane.prefHeightProperty().bind(container.heightProperty());
        Scene scene = new Scene(container, 500, 500);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
person ItachiUchiha    schedule 24.06.2015