Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过单独窗口上的复选框隐藏TableView的TableColumns_Java_Javafx_Tableview_Fxml_Tablecolumn - Fatal编程技术网

Java 通过单独窗口上的复选框隐藏TableView的TableColumns

Java 通过单独窗口上的复选框隐藏TableView的TableColumns,java,javafx,tableview,fxml,tablecolumn,Java,Javafx,Tableview,Fxml,Tablecolumn,我有一个用fxml编写的窗口,其中有一个TableView和一些TableColumns以及其他东西。 我试图在该窗口的控制器中创建一个函数,该函数允许用户通过单独窗口上的一组复选框选择要显示的列。 此窗口将是HealthCheckTab的子窗口。它将有一个按钮,一旦按下该按钮,将获得所有复选框的状态,并将调用HealtkcheckTab中的一个函数,该函数将更新Tableview,使不需要的列不可见 这是包含TableView(提取)的窗口 这是控制器(摘录) @FXML 私有树视图; @

我有一个用fxml编写的窗口,其中有一个TableView和一些TableColumns以及其他东西。 我试图在该窗口的控制器中创建一个函数,该函数允许用户通过单独窗口上的一组复选框选择要显示的列。 此窗口将是HealthCheckTab的子窗口。它将有一个按钮,一旦按下该按钮,将获得所有复选框的状态,并将调用HealtkcheckTab中的一个函数,该函数将更新Tableview,使不需要的列不可见

这是包含TableView(提取)的窗口


这是控制器(摘录)

@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);
    }
}