2016-11-02 14 views
0

私はJavaFXを使用してUIを生成するJavaプロジェクトを手に入れました。私はJavaプログラマーではありません(一般的なプログラマーではありません - 私はCS学生です)。それは少しの学習経験ですが、一般的に私は自分の質問に答えています。私は今、TableViewでスティッキースポットに当たっていますが、少し失われています。具体的には、TableViewとのやりとりに対応して何らかのアクションを設定することはできません。FXMLのTableView onMousePressedアクションを定義する

私のプロジェクトの現在のレイアウトは、Main.java、Controller.java、およびUI.fxmlです。 Mainでは、プログラムが開始されると、ペイン/シーンがUI.fxmlからロードされます。 (技術的には、このプロジェクトは、コードのいくつかの他のビットが含まれていますが、私は唯一の関連何投稿しようとしている。)私は、テーブルビューはそうとUI.fxmlで定義されています:

<TableView fx:id="queueTable"> 
    <columns> 
     <TableColumn text="Title"> 
      <cellValueFactory> 
       <PropertyValueFactory property="tableTitle"/> 
      </cellValueFactory> 
     </TableColumn> 
     <TableColumn text="Artist"> 
      <cellValueFactory> 
       <PropertyValueFactory property="tableArtist"/> 
      </cellValueFactory> 
     </TableColumn> 
     <TableColumn text="Album"> 
     <cellValueFactory> 
       <PropertyValueFactory property="tableAlbum"/> 
      </cellValueFactory> 
     </TableColumn> 
    </columns> 
</TableView> 

は、同様に、私はUIで定義されたいくつかのボタンがありますようonActionと.fxml:

<Button fx:id="buttonQueueAdd" text="Add" onAction="#addMediaToQueue"/> 

を私の前のコードでは、私は私のテーブルビューが生成されていた方法では、テーブルビュー内のアイテムが選択された場合のイベントを定義することができました。ただし、すべてのUIの作成はFXMLファイルを介して行われます。 FXMLファイルには、それが参照するコントローラクラス(Controller.java)があります。ここではすべてのアクションがさまざまなボタンに対して定義されていますが、FXMLではonAction,setOnMousePressedなどの属性を受け付けるようには見えませんボタンの 'onAction'属性を受け付けるように、TableViewのファイルを開きます。

メインクラスでアクションを定義する(またはシーンが作成されているときにメインクラスで呼び出されたコントローラクラスでメソッドを作成する)ことで回避策を得ることはできますが、そうではありません私のコントローラクラス内で静的にqueueTableを作成しない限り、TableView内のアイテムを操作するすべての関数が破損します。たとえば、アイテムが追加されたことを示すためにUIが更新されません。

FXMLで作成されたTableViewを作成せず、TableViewを作成し、そのすべてのonMousePressedイベントなどをFXMLファイルの外に設定し、それらをシーンメインクラスのstartメソッド。これはそれが以前に行われた方法であり、それは受け入れられていました。しかし、それは乱雑に思えますし、私のUI要素が複数のクラスやFXMLファイルに広がってしまいます。これは他のいくつかの学生と一緒に取り組んでいるプロジェクトです。私はすべてを流線型にして整理しようとしていますできるだけ。私は弾を噛んで "厄介な"やり方をしなければならないのですか、それとも良い選択肢がありますか?

答えて

0

fxmlを使用してTableViewを生成することはできますが、コントローラにはinitializeメソッドを追加できます。

@FXML 
private void initialize() { 
    queueTable.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> { 
     ... 
    }); 
} 

をする場合には、あなたがこのリスナーを追加する必要があります。それは、オブジェクトstuctureを作成して行われます、あなたはFXMLから行うことができないオブジェクト構造への変更を行うために使用することができた後、このメソッドは、FXMLLoaderによって呼び出されますMainから、コントローラにメソッドを追加し、コントローラをfxmlの作成に使用するFXMLLoaderインスタンスから取得できます。

コントローラ

public void addSelectedIndexListener(ChangeListener<? super Number> listener) { 
    queueTable.getSelectionModel().selectedIndexProperty().addListener(listener); 
} 

メイン

FXMLLoader loader = new FXMLLoader(fxmlUrl); 
myNode = loader.load(); 
Controller controller = loader.getController(); 
controller.addSelectedIndexListener((observable, oldValue, newValue) -> { 
    ... 
}); 

プロパティプロパティです注選択モデルの性質に依存しなければならない、あなたはexpression bindingを使用することができる可能性が所望の効果を達成する。

<BorderPane xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1"> 
    <center> 
     <TableView fx:id="table" BorderPane.alignment="CENTER"> 
      <columns> 
       <TableColumn text="value"> 
        <cellValueFactory> 
         <PropertyValueFactory property="value"/> 
        </cellValueFactory> 
       </TableColumn> 
      </columns> 
      <items> 
       <FXCollections fx:factory="observableArrayList"> 
        <Item value="Hello World"/> 
        <Item value="42"/> 
       </FXCollections> 
      </items> 
     </TableView> 
    </center> 
    <left> 
     <Button mnemonicParsing="false" text="Remove" BorderPane.alignment="CENTER" disable="${table.selectionModel.selectedIndex+0&lt;0}" /> 
    </left> 
</BorderPane> 

JavaFXのは、現在null -safe平等のチェックを使用していない(table.selectionModel.selectedItem==nullが動作しない)との比較のため0一定の権利の種類を取得することはできませんので、table.selectionModel.selectedIndex+0<0部分は、使用回避策であることに注意してください(table.selectionModel.selectedIndex<0 )、これは現在のところ良い選択肢のようには思えません。

関連する問題