2017-07-10 14 views
-1

実行時に異なる種類のオブジェクトを保持できるTableViewを持つことは可能ですが、一度に1種類のオブジェクトのみを保持できますか?アプリケーション全体の異なるオブジェクトのTableView

私が直面している特定のケースは、検索の結果を表示するために使用したいTableViewです。これらの検索は、結果として異なる「オブジェクト」を生成する可能性があります。義務的なPersonAddressとしましょう。ユーザーがどちらかを検索すると、結果はPersonまたはAddressのいずれかのセットになります。
検索後、テーブルはそれに応じて変更されます(getItems().clear();getColumns().clear();)しかし、私はすでに充填を実装に固執しています。
FXMLで初期化されたTableView<?> searchResultsと宣言されたTableViewを取得しました。今、私はテーブルにnew TableColumn<Person, String>を追加しようとしたとエラーに直面:だから、これは明らかに動作して表示されません

'add(javafx.scene.control.TableColumn<capture<?>,?>)' in 'java.util.List' cannot be applied to '(javafx.scene.control.TableColumn<de.wolfsburg.stadt.beurteilungFX.controllers.tabletypes.CheckNote,java.lang.String>)' 

を。
私が得たクラスは両方とも同じインターフェイスを実装しているので、私はまたTableView<? extends MyInterface>TableView<MyInterface>としてTableViewを宣言しようとしましたが、どちらの場合も成功しませんでした。
同じインターフェースを実装していますが、フィールドの数とフィールドの名前がクラスによって異なります。

もう一度質問:同じクラスと複数のクラスの複数のオブジェクトをサポートするTableViewを持つことができますか?

注:私は研究中にthis questionを見つけましたが、私は同じクラスのオブジェクトを最初に要求し、後でクラスの変更を求めるのに対し、異なるクラスについては同時に質問しているようです。

確かにもう1つの方法は、同時に2つの文字を隠すことです。しかし、これは、10以上の異なるクラスをサポートする必要がある大きな用途では、多くのメモリを消費することになります。

+0

'TableView 'を使っても問題ありませんが、テーブルを置き換えるだけではどうですか? –

+0

'TableView 'はまだ 'TableColumn 'を受け入れません。テーブルを置き換えるというアイデアは何ですか?私が最後に言いました?私はこのようなことをやりたいと思っていたので、アプリケーションがアップグレード/拡張されるにつれ、私は説明された問題に直面したくありません。置き換える場合、新しいTableViewを作成することは、宣言された型が同じままで上記の列を受け入れないため、どちらも機能しません。私は、Interfaceがフィールドの数とそれらの名前に責任を負わないことに注意しました。 – geisterfurz007

+0

'TableView 'をお持ちの場合は、 'TableColumn '(または他のカラムタイプ)を使用する必要があります。テーブルを置き換えることによって、私はUIから完全に 'TableView 'を削除し、それを表示したいときは新しい 'TableView

'を追加することを意味しました(例えば)。表示されていないテーブルをメモリに保持する必要はありません。 –

答えて

1

あなたは、以下のように簡単に、インタフェースを使用してこの操作を行うことができます。

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.stage.Stage; 

public class TableViewViaInterface extends Application { 

    private TableView<TableEntry> table ; 

    @Override 
    public void start(Stage primaryStage) { 
     table = new TableView<>(); 
     BorderPane root = new BorderPane(table); 
     Button showPersonTable = new Button("Person table"); 
     showPersonTable.setOnAction(e -> showPersonTable()); 
     Button showAddressTable = new Button("Address table"); 
     showAddressTable.setOnAction(e -> showAddressTable()); 

     HBox buttons = new HBox(5, showPersonTable, showAddressTable); 
     buttons.setAlignment(Pos.CENTER); 
     buttons.setPadding(new Insets(5)); 
     root.setBottom(buttons); 

     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void showPersonTable() { 
     table.getColumns().clear(); 
     TableColumn<TableEntry, String> firstNameCol = new TableColumn<>("First Name"); 
     firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName")); 
     table.getColumns().add(firstNameCol); 

     TableColumn<TableEntry, String> lastNameCol = new TableColumn<>("Last Name"); 
     lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName")); 
     table.getColumns().add(lastNameCol); 

     // populate table... 
    } 

    private void showAddressTable() { 
     table.getColumns().clear(); 
     TableColumn<TableEntry, String> streetCol = new TableColumn<>("Street"); 
     streetCol.setCellValueFactory(new PropertyValueFactory<>("street")); 
     table.getColumns().add(streetCol); 

     TableColumn<TableEntry, String> cityCol = new TableColumn<>("City"); 
     cityCol.setCellValueFactory(new PropertyValueFactory<>("city")); 
     table.getColumns().add(cityCol); 

     // populate table... 

    } 

    public interface TableEntry {} 
    public class Person implements TableEntry { 
     private final StringProperty firstName = new SimpleStringProperty(); 
     private final StringProperty lastName = new SimpleStringProperty(); 
     public final StringProperty firstNameProperty() { 
      return this.firstName; 
     } 

     public final java.lang.String getFirstName() { 
      return this.firstNameProperty().get(); 
     } 

     public final void setFirstName(final java.lang.String firstName) { 
      this.firstNameProperty().set(firstName); 
     } 

     public final StringProperty lastNameProperty() { 
      return this.lastName; 
     } 

     public final java.lang.String getLastName() { 
      return this.lastNameProperty().get(); 
     } 

     public final void setLastName(final java.lang.String lastName) { 
      this.lastNameProperty().set(lastName); 
     } 

    } 

    public class Address implements TableEntry { 
     private final StringProperty street = new SimpleStringProperty(); 
     private final StringProperty city = new SimpleStringProperty(); 
     public final StringProperty streetProperty() { 
      return this.street; 
     } 

     public final java.lang.String getStreet() { 
      return this.streetProperty().get(); 
     } 

     public final void setStreet(final java.lang.String street) { 
      this.streetProperty().set(street); 
     } 

     public final StringProperty cityProperty() { 
      return this.city; 
     } 

     public final java.lang.String getCity() { 
      return this.cityProperty().get(); 
     } 

     public final void setCity(final java.lang.String city) { 
      this.cityProperty().set(city); 
     } 



    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

私はあなたがテーブルを切り替えたいとき、完全にテーブルを置き換える推薦するけれども:

public class TableViewViaInterface extends Application { 

    private BorderPane root ; 
    private TableView<? extends TableEntry> table ; 

    @Override 
    public void start(Stage primaryStage) { 
     root = new BorderPane(); 
     Button showPersonTable = new Button("Person table"); 
     showPersonTable.setOnAction(e -> showPersonTable()); 
     Button showAddressTable = new Button("Address table"); 
     showAddressTable.setOnAction(e -> showAddressTable()); 

     HBox buttons = new HBox(5, showPersonTable, showAddressTable); 
     buttons.setAlignment(Pos.CENTER); 
     buttons.setPadding(new Insets(5)); 
     root.setBottom(buttons); 

     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void showPersonTable() { 

     TableView<Person> personTable = new TableView<>(); 
     personTable.getColumns().clear(); 
     TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name"); 
     firstNameCol.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty()); 
     personTable.getColumns().add(firstNameCol); 

     TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name"); 
     lastNameCol.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty()); 
     personTable.getColumns().add(lastNameCol); 

     // populate table... 

     this.table = personTable ; 
     root.setCenter(personTable); 
    } 

    private void showAddressTable() { 

     TableView<Address> addressTable = new TableView<>(); 
     addressTable.getColumns().clear(); 
     TableColumn<Address, String> streetCol = new TableColumn<>("Street"); 
     streetCol.setCellValueFactory(cellData -> cellData.getValue().streetProperty()); 
     addressTable.getColumns().add(streetCol); 

     TableColumn<Address, String> cityCol = new TableColumn<>("City"); 
     cityCol.setCellValueFactory(cellData -> cellData.getValue().cityProperty()); 
     addressTable.getColumns().add(cityCol); 

     // populate table... 

     this.table = addressTable ; 
     root.setCenter(addressTable); 

    } 

    // interface and classes as above... 
} 

注意をするときにすることを以前のテーブルとそのすべてのデータは、保持されている古いテーブルへの参照がないため、ガベージコレクションの対象となります。

+0

これは明らかに機能します! PropertyValueFactory内で値がどのように取得されているかを調べ、対応する 'CellDataFeatures 'の 'S'部分を参照するメソッドを見ただけで、私の場合はMyInterfaceとなり、明らかにメソッドが探していると思ったフィールドはありません。しかし、私はちょうどそこに何かを誤解したと思います。 あなたの時間、努力と助けてくれてありがとう! – geisterfurz007

+0

@ geisterfurz007あなたの質問の下のコメントで述べたように、 'PropertyValueFactory'はリフレクションを使用するので、テーブルのコンパイル時の型ではなく、各行のオブジェクトの実行時の型だけに依存します。私はそれをやる方法を示すバージョンを追加しました。 –

関連する問題