Java 通过单独窗口上的复选框隐藏TableView的TableColumns
我有一个用fxml编写的窗口,其中有一个TableView和一些TableColumns以及其他东西。 我试图在该窗口的控制器中创建一个函数,该函数允许用户通过单独窗口上的一组复选框选择要显示的列。 此窗口将是HealthCheckTab的子窗口。它将有一个按钮,一旦按下该按钮,将获得所有复选框的状态,并将调用HealtkcheckTab中的一个函数,该函数将更新Tableview,使不需要的列不可见 这是包含TableView(提取)的窗口Java 通过单独窗口上的复选框隐藏TableView的TableColumns,java,javafx,tableview,fxml,tablecolumn,Java,Javafx,Tableview,Fxml,Tablecolumn,我有一个用fxml编写的窗口,其中有一个TableView和一些TableColumns以及其他东西。 我试图在该窗口的控制器中创建一个函数,该函数允许用户通过单独窗口上的一组复选框选择要显示的列。 此窗口将是HealthCheckTab的子窗口。它将有一个按钮,一旦按下该按钮,将获得所有复选框的状态,并将调用HealtkcheckTab中的一个函数,该函数将更新Tableview,使不需要的列不可见 这是包含TableView(提取)的窗口 这是控制器(摘录) @FXML 私有树视图; @
这是控制器(摘录)
@FXML
私有树视图;
@FXML
私有TableView-HcTable;
@FXML
私家床;
@FXML
私有表列colName;
@FXML
私有表列colVal;
@FXML
私人桌面资源中心;
@FXML
私有表列colDatatype;
@FXML
专用表格工具;
@FXML
私有表列colPrio;
@FXML
私用床柱镜;
@FXML
私有表列colAvg;
@FXML
私有表列colMin;
@FXML
私有表列colRelComp;
// -----------------------------------------------------------------------------------------------
//刷新表
// -----------------------------------------------------------------------------------------------
公共空刷新表(){
System.out.println(“应用”);
colScope.setVisible(true);
//colId.setVisible(假);
}
单独窗口(摘录)
@FXML
私有无效handleApplyViewOptions(){
试一试{
FXMLLoader=newFXMLLoader(getClass().getResource(“HealthCheckTab.fxml”);
舞台=新舞台(舞台风格装饰);
stage.setScene(新场景(loader.load());
HealthCheckTabController=loader.getController();
controller.refreshttable();
}捕获(IOE异常){
java.lang.System.err.println(e.getStackTrace());
}
Stage Stage=(Stage)btnApply.getScene().getWindow();
stage.close();
}
refreshTable函数根本不隐藏范围列。
我不知道为什么…您正在加载
HealthCheckTab.fxml
中定义的UI的新副本,并在控制器上为该UI调用refreshttable
(从未显示)
可能更简单的方法是在创建的对话框中注册onHidden
处理程序,并在对话框隐藏时调用refreshttable
以下是SSCCE:
Main.fxml:
MainController.java:
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.stage.Stage;
public class MainController {
@FXML
private TableColumn<Void, Void> nameColumn ;
@FXML
private TableColumn<Void, Void> optionalColumn ;
@FXML
private void showViewOptions() throws IOException {
FXMLLoader loader = new FXMLLoader(ViewOptionsController.class.getResource("ViewOptions.fxml"));
Parent root = loader.load();
ViewOptionsController controller = loader.getController();
controller.setOptionalColumnVisible(optionalColumn.isVisible());
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.initOwner(nameColumn.getTableView().getScene().getWindow());
stage.setOnHidden(e -> {
refreshTable(controller.isOptionalColumnVisible());
});
stage.show();
}
private void refreshTable(boolean showOptionalColumn) {
optionalColumn.setVisible(showOptionalColumn);
}
}
import javafx.beans.property.BooleanProperty;
import javafx.fxml.FXML;
import javafx.scene.control.CheckBox;
public class ViewOptionsController {
@FXML
private CheckBox optionalColumnVisibleCheckBox ;
public BooleanProperty optionalColumnVisibleProperty() {
return optionalColumnVisibleCheckBox.selectedProperty();
}
public final boolean isOptionalColumnVisible() {
return optionalColumnVisibleProperty().get();
}
public final void setOptionalColumnVisible(boolean optionalColumnVisible) {
optionalColumnVisibleProperty().set(optionalColumnVisible);
}
@FXML
private void close() {
optionalColumnVisibleCheckBox.getScene().getWindow().hide();
}
}
应用程序类别:
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class HideColumnsFromDialog extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load(MainController.class.getResource("Main.fxml"));
Scene scene = new Scene(root, 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
另外,请注意,您在这里实现的功能已经内置到表视图中:您可以使用
该表将显示一个按钮,显示一个下拉菜单,用户可以从中选择哪些列是可见的。1。“范围”列似乎有索引7,而不是索引8。(为什么不直接调用
colScope.setVisible(…)
2。您希望调用setVisible(true)
会隐藏某些内容吗?3.您在哪里调用refreshttable()
?我建议您创建一个演示问题的示例,并发布该示例,而不是发布项目的不完整部分(其中包含大量与问题无关的代码)。是的,我希望setVisible(true)能够更改某些内容,我遗漏了什么/做错了什么?我省略了不必要的部分,并添加了调用刷新的行……当然,如果您想隐藏某些内容,您可以使用setVisible(false)
???在handleApplyViewOptions
方法中,我看不到您在哪里显示了您创建的新阶段。同样,所有这些都会更容易诊断(无论是对您还是对其他人),如果您要编写一个特定的(即新的)应用程序,而该应用程序只是尝试完成您遇到问题的部分。简单地发布一个较大项目的代码片段并没有多大帮助。
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.stage.Stage;
public class MainController {
@FXML
private TableColumn<Void, Void> nameColumn ;
@FXML
private TableColumn<Void, Void> optionalColumn ;
@FXML
private void showViewOptions() throws IOException {
FXMLLoader loader = new FXMLLoader(ViewOptionsController.class.getResource("ViewOptions.fxml"));
Parent root = loader.load();
ViewOptionsController controller = loader.getController();
controller.setOptionalColumnVisible(optionalColumn.isVisible());
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.initOwner(nameColumn.getTableView().getScene().getWindow());
stage.setOnHidden(e -> {
refreshTable(controller.isOptionalColumnVisible());
});
stage.show();
}
private void refreshTable(boolean showOptionalColumn) {
optionalColumn.setVisible(showOptionalColumn);
}
}
import javafx.beans.property.BooleanProperty;
import javafx.fxml.FXML;
import javafx.scene.control.CheckBox;
public class ViewOptionsController {
@FXML
private CheckBox optionalColumnVisibleCheckBox ;
public BooleanProperty optionalColumnVisibleProperty() {
return optionalColumnVisibleCheckBox.selectedProperty();
}
public final boolean isOptionalColumnVisible() {
return optionalColumnVisibleProperty().get();
}
public final void setOptionalColumnVisible(boolean optionalColumnVisible) {
optionalColumnVisibleProperty().set(optionalColumnVisible);
}
@FXML
private void close() {
optionalColumnVisibleCheckBox.getScene().getWindow().hide();
}
}
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class HideColumnsFromDialog extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load(MainController.class.getResource("Main.fxml"));
Scene scene = new Scene(root, 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}