簡體   English   中英

在FXML中定義TableView onMousePressed動作

[英]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中的任何屬性,例如onActionsetOnMousePressed等。 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&lt;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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM