2015-06-24 4 views
1

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

Возможно ли это?

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

«главный» = principal.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" = NewUserFormController.java

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

премьер = Principal

Я поставил Principal.java в mainApp для контроллеров

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

ответ

1

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

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

Edit:
Это не работает, потому что вы не используете контроллер, который был создан 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().

+0

@ RonaldoLinspinho, см. Обновление. Если он все еще не работает, опишите эту нерабочую проблему более подробно. –

+0

Небольшая ошибка может привести нас к испорчению кода. Спасибо! –

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(); 
    } 
} 
+0

Спасибо за ваше время! Не работал для меня. –

Смежные вопросы