单击其中的 save/cancel 按钮时如何关闭 Javafx 2.2 选项卡?
How can I close a Javafx 2.2 Tab when clicking a save/cancel button inside it?
我有一个 JavaFX 2.2 项目,它使用 Tabpane 来动态 open/close 标签。我想在单击 save/close 按钮时关闭选项卡。
可能吗?
虽然我很容易得到答案,但我得说这是 fxml 项目 Javafx 2.2,涉及 3 个 classes,main class,mainclassController 和tabcontroller 像这样:
"main" = 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.java mainApp
如您所见,我已经尝试了很多可能性。
您可以通过 Save/Cancel
按钮的操作从 TabPane 的 ObservableList<Tab>
中删除当前选项卡。
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();
}
}
您可以假定按钮将在当前活动的选项卡上被单击,因此关闭该活动的选项卡。执行按钮操作:
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()
。
我有一个 JavaFX 2.2 项目,它使用 Tabpane 来动态 open/close 标签。我想在单击 save/close 按钮时关闭选项卡。
可能吗?
虽然我很容易得到答案,但我得说这是 fxml 项目 Javafx 2.2,涉及 3 个 classes,main class,mainclassController 和tabcontroller 像这样:
"main" = 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.java mainApp
如您所见,我已经尝试了很多可能性。
您可以通过 Save/Cancel
按钮的操作从 TabPane 的 ObservableList<Tab>
中删除当前选项卡。
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();
}
}
您可以假定按钮将在当前活动的选项卡上被单击,因此关闭该活动的选项卡。执行按钮操作:
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()
。