[英]Defining TableView onMousePressed actions in FXML
我有一個正在使用JavaFX生成UI的Java項目。 我不是Java程序員(一般不是程序員-我是CS學生),所以有點學習經驗,但是通常我會回答自己的問題。 不過,我現在正在用TableView碰到一個棘手的地方,並且迷失了一點-具體來說,我似乎無法為響應與TableView的交互設置任何動作。
我項目的當前布局是Main.java,Controller.java和UI.fxml。 在Main中,在程序啟動時從UI.fxml加載窗格/場景。 (從技術上講,該項目包含其他幾段代碼,但是我僅嘗試發布相關的代碼。)我在UI.fxml中定義了一個TableView:
<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.fxml中使用onAction定義了幾個按鈕:
<Button fx:id="buttonQueueAdd" text="Add" onAction="#addMediaToQueue"/>
在我之前的代碼中,我能夠在生成TableView的方法中為在TableView中選擇一項時定義一個事件。 但是,現在,所有UI的創建都是通過FXML文件完成的。 FXML文件具有一個它引用的控制器類(Controller.java),其中為所有按鈕定義了所有動作,但是我似乎無法讓它接受FXML中的任何屬性,例如onAction
, setOnMousePressed
等。 TableView的文件,就像它接受Button的'onAction'屬性一樣。
似乎可以通過在Main類中定義操作(或在創建場景時在Main類中的Controller類中創建一個方法)中找到一種解決方法,但是除非我這樣做,否則該方法將不起作用我的Controller類中的queueTable
靜態...然后破壞了操作TableView中項目的所有功能-例如,我無法再將項目添加到TableView中/ UI不刷新以顯示已添加項目。
似乎最好的解決方案是不要在FXML中創建TableView,而是在FXML文件之外設置TableView及其所有onMousePressed事件等,並將其添加到Main類的start
方法中。 。 這是以前的工作方式,然后可以令人滿意地工作。 但是,這看起來很混亂,並導致我的UI元素散布在多個類和/或FXML文件中-這是我正在與其他幾個學生一起工作的項目,並且我試圖將所有內容保持簡化/組織盡可能。 我需要咬一口子然后以“凌亂”的方式進行操作,還是有更好的選擇?
您仍然可以使用fxml生成TableView
,但是向控制器添加一個initialize
方法。 創建對象結構后, FXMLLoader
會調用此方法,該方法可用於對無法從fxml中執行的對象結構進行修改:
@FXML
private void initialize() {
queueTable.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> {
...
});
}
如果需要從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) -> {
...
});
注意,一個屬性屬性應該取決於選擇模型的屬性,您也許可以使用表達式綁定來達到預期的效果。
<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<0}" />
</left>
</BorderPane>
請注意, table.selectionModel.selectedIndex+0<0
部分是使用的解決方法,因為JavaFX當前不使用null
table.selectionModel.selectedItem==null
相等性檢查( table.selectionModel.selectedItem==null
)並且無法獲取類型。用於比較的常量0
右( table.selectionModel.selectedIndex<0
),因此當前似乎不是一個好的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.