如何在单击其中的保存/取消按钮时关闭Javafx 2.2选项卡?

时间:2015-06-24 04:20:26

标签: java javafx fxmlloader

我有一个JavaFX 2.2项目,它使用Tabpane来动态打开/关闭Tabs。当我点击它上面的保存/关闭按钮时,我想关闭一个标签。

有可能吗?

我虽然可以轻松得到答案,但是要说这是fxml项目Javafx 2.2,涉及3个类,主类,mainclassController和tabcontroller如此:

"主" = principal.java

localhost/2015/06...

" mainController" = baseWindowController.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();

}

并且

" tabController" = NewUserFormController.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()); 
        }  
   });      
}  

prime = Principal

我已将Principal.java设置为控制器的mainApp

正如你所看到的,我已经尝试了很多可能性。

2 个答案:

答案 0 :(得分:1)

您可以假设该按钮将在当前活动的选项卡上单击,因此请关闭此活动选项卡。按钮操作:

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

编辑:
它没有用,因为你没有使用由FXMLLoader创建的Controller,你的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()

答案 1 :(得分:0)

您可以通过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();
    }
}