2017-06-22 14 views
-1

私は、TableViewといくつかのTableColumnsなどを含むfxmlで書かれたウィンドウを持っています。 私はこのウィンドウにコントローラ内の関数を作成しようとしています。これにより、ユーザーは別のウィンドウに一連のチェックボックスを使って表示する列を選択できます。 このウィンドウはHealthCheckTabの子ウィンドウになります。ボタンを押すと、すべてのチェックボックスの状態が取得され、不要な列が表示されないようにTableviewを更新するHealtkcheckTabの関数が呼び出されます。別のウィンドウでCheckBoxを介してTableViewのTableColumnsを非表示にする

これは、これはコントローラ(抽出)

@FXML 
    private TreeView<String> HCTree; 
    @FXML 
    private TableView<Map> HcTable; 

    @FXML 
    private TableColumn<Map, String> colId; 
    @FXML 
    private TableColumn<Map, String> colName; 
    @FXML 
    private TableColumn<Map, String> colVal; 
    @FXML 
    private TableColumn<Map, String> colDescrCn; 
    @FXML 
    private TableColumn<Map, String> colDatatype; 
    @FXML 
    private TableColumn<Map, String> colTool; 
    @FXML 
    private TableColumn<Map, String> colPrio; 
    @FXML 
    private TableColumn<Map, String> colScope; 
    @FXML 
    private TableColumn<Map, String> colAvg; 
    @FXML 
    private TableColumn<Map, String> colMin; 
    @FXML 
    private TableColumn<Map, String> colRelComp; 



    // ----------------------------------------------------------------------------------------------- 
    // REFRESH TABLE 
    // ----------------------------------------------------------------------------------------------- 

    public void refreshTable() { 
     System.out.println("apply"); 
     colScope.setVisible(true); 
     //colId.setVisible(false); 


    } 

別ウィンドウ(抽出)

@FXML 
    private void handleApplyViewOptions() { 
     try { 
      FXMLLoader loader = new FXMLLoader(getClass().getResource("HealthCheckTab.fxml")); 
      Stage stage = new Stage(StageStyle.DECORATED); 
      stage.setScene(new Scene(loader.load())); 
      HealthCheckTabController controller = loader.<HealthCheckTabController> getController(); 
      controller.refreshTable(); 
     } catch (IOException e) { 
      java.lang.System.err.println(e.getStackTrace()); 
     } 
     Stage stage = (Stage) btnApply.getScene().getWindow(); 
     stage.close(); 
    } 

RefreshTableの関数であり、テーブルビュー(抽出)

     </TitledPane> 
         <TitledPane fx:id="classificationNumbers" animated="false" 
          text="HealthCheck Classification Numbers"> 
          <content> 
           <ScrollPane fitToHeight="true" fitToWidth="true" 
            hbarPolicy="ALWAYS" maxHeight="1.7976931348623157E308" 
            maxWidth="1.7976931348623157E308" pannable="true"> 
            <content> 
             <TableView fx:id="HcTable" editable="true" 
              maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" 
              minWidth="-Infinity" tableMenuButtonVisible="true"> 
              <columns> 
               <TableColumn fx:id="colId" editable="false" 
                maxWidth="-Infinity" minWidth="40.0" prefWidth="-1.0" text="ID" /> 
               <TableColumn fx:id="colName" editable="false" 
                maxWidth="1.7976931348623157E308" minWidth="60.0" 
                prefWidth="-1.0" text="Name" /> 
               <TableColumn fx:id="colVal" maxWidth="1.7976931348623157E308" 
                minWidth="55.0" prefWidth="-1.0" text="Value" /> 
               <TableColumn fx:id="colDescrCn" editable="false" 
                maxWidth="1.7976931348623157E308" minWidth="90.0" 
                prefWidth="-1.0" text="Comment (CN)" /> 
               <TableColumn fx:id="colDatatype" editable="false" 
                maxWidth="1.7976931348623157E308" minWidth="80.0" 
                prefWidth="-1.0" text="Datatype" /> 
               <TableColumn fx:id="colTool" maxWidth="1.7976931348623157E308" 
                minWidth="50.0" prefWidth="-1.0" text="Tool" visible="false" /> 
               <TableColumn fx:id="colPrio" editable="false" 
                maxWidth="1.7976931348623157E308" minWidth="60.0" 
                prefWidth="-1.0" text="Priority" /> 
               <TableColumn fx:id="colScope" maxWidth="1.7976931348623157E308" 
                minWidth="50.0" prefWidth="-1.0" text="Scope" visible="false" /> 
               <TableColumn fx:id="colAvg" editable="false" 
                maxWidth="1.7976931348623157E308" minWidth="50.0" 
                prefWidth="-1.0" text="AVG" visible="false" /> 
               <TableColumn fx:id="colMin" maxWidth="1.7976931348623157E308" 
                minWidth="50.0" prefWidth="-1.0" text="MIN" visible="false" /> 
               <TableColumn fx:id="colRelComp" prefWidth="122.0" 
                text="Relative Comparable" /> 
              </columns> 
             </TableView> 
            </content> 
           </ScrollPane> 
          </content> 
         </TitledPane> 

有するウィンドウでありますScope Columnをまったく隠すわけではありません。 理由がわかりません...

+0

1. "scope"カラムは8でなく、インデックス7を持っているように見えます(なぜなら 'colScope.setVisible(...) 'をとにかく呼び出さないでください)2. setVisible(true)何かを隠すだろうか? 3.あなたは 'refreshTable()'をどこで呼びますか?プロジェクトの不完全な部分(問題に関係のないコードがたくさんある)を投稿するのではなく、問題を示す[MCVE]を作成して投稿することをお勧めします。 –

+0

はい私はsetVisible(true)が何かを変更することを期待していましたが、何が間違っているのか間違っていますか?私は不要な部分を取り除き、リフレッシュが呼び出される行を追加しました... –

+0

確かに、何かを非表示にするには 'setVisible(false)'を使いますか? –

答えて

2

HealthCheckTab.fxmlで定義されたUIの新しいコピーをロードし、そのUIのコントローラー(これは表示されません)にrefreshTableを呼び出しています。

おそらく簡単なアプローチは、作成するダイアログにonHiddenハンドラを登録し、ダイアログが非表示のときにrefreshTableを呼び出すことです。ここで

がSSCCEです:

Main.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.layout.HBox?> 
<?import javafx.scene.control.Button?> 
<?import javafx.geometry.Insets?> 

<BorderPane fx:controller="MainController" xmlns:fx="http://javafx.com/fxml/1"> 
    <center> 
     <TableView > 
      <columns> 
       <TableColumn fx:id="nameColumn" text="Name" /> 
       <TableColumn fx:id="optionalColumn" text="Data" /> 
      </columns> 
     </TableView> 
    </center> 
    <bottom> 
     <HBox alignment="CENTER"> 
      <Button text="Configure View" onAction="#showViewOptions" /> 
      <padding> 
       <Insets top="5" left="5" bottom="5" right="5"/> 
      </padding> 
     </HBox> 
    </bottom> 
</BorderPane> 

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

ViewOptions.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.layout.VBox?> 
<?import javafx.scene.control.CheckBox?> 
<?import javafx.scene.control.Button?> 
<?import javafx.geometry.Insets?> 

<VBox fx:controller="ViewOptionsController" spacing="5" alignment="center" xmlns:fx="http://javafx.com/fxml/1"> 
    <CheckBox text="Show Data Column" fx:id="optionalColumnVisibleCheckBox" /> 
    <Button text="OK" onAction="#close" /> 
    <padding> 
     <Insets top="5" left="5" right="5" bottom="5"/> 
    </padding> 
</VBox> 

ViewOptionsController.java:

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

Applicationクラス:余談として

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

は、あなたがここに実装している機能は、すでにテーブルビューに組み込まれていることに注意してください:あなたが使用することができます

<TableView fx:id="HcTable" tableMenuButtonVisible="true" ... > 

と表示され、ドロップダウンメニューが表示されたボタンが表示され、そこからユーザーは表示可能な列を選択できます。