第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據(jù)用于填充表的列表元素中未顯示的 java bean 值設(shè)置 JavaFX FXML 表行文本顏色

根據(jù)用于填充表的列表元素中未顯示的 java bean 值設(shè)置 JavaFX FXML 表行文本顏色

蕪湖不蕪 2021-11-03 14:44:09
我正在嘗試將我在 Swing 中構(gòu)建的應(yīng)用程序轉(zhuǎn)換為 JavaFx。這包括徹底檢查 GUI 設(shè)計。應(yīng)用程序處理數(shù)據(jù)如下:從數(shù)據(jù)庫中檢索數(shù)據(jù)。數(shù)據(jù)庫中的每一行都被解析為一個 java bean,每個 bean 被添加到一個 ArrayList。然后將數(shù)組列表返回給調(diào)用方法,然后解析為 ObservableList 以使其與 JavaFX tableview 兼容。然后我通過向它添加每個 List 元素(它是一個 java bean)來填充該表。重要的是,構(gòu)成表格每一行的 Java bean 有 12 個元素。該表在其 9 列中僅向用戶顯示其中的 9 個。我正在嘗試使用行列表元素中其他未顯示的值之一,并使用它來確定所顯示行的文本顏色是設(shè)置為紅色還是綠色。我似乎無法管理這個。我在 Stack 和其他論壇上查看了其他幾個類似的問題,它們似乎解決了為特定單元格或列而不是行設(shè)置單元格文本顏色的問題。他們似乎也依靠可見的顯示值來做到這一點。我嘗試了幾種方法,但它們似乎都不起作用,而且它們看起來很復雜。我正在嘗試做的事情必須有更直接的方法,因為這必須是一個相當普遍的要求。我的表在 FXML 中定義如下: <TableView fx:id="toDoTable" editable="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">           <columns>              <TableColumn fx:id="todoID" prefWidth="59.0" text="ID" />              <TableColumn id="columnHeader" fx:id="Charity" prefWidth="77.0" text="Charity" />              <TableColumn fx:id="todoFunder" prefWidth="101.0" text="Funder" />              <TableColumn fx:id="todoType" prefWidth="92.0" text="Task Type" />              <TableColumn fx:id="todoInternalDeadline" prefWidth="145.0" text="Internal Deadline" />              <TableColumn fx:id="todoExternalDeadline" prefWidth="145.0" text="External Deadline" />              <TableColumn fx:id="todoHrs" prefWidth="140.0" text="Target Hours" />              <TableColumn fx:id="todoActualHrs" prefWidth="110.0" text="Actual Hours" />              <TableColumn fx:id="todoDescription" prefWidth="110.0" text="Description" />           </columns>        </TableView>我的另一個想法是使用 lambda 來處理表格行內(nèi)容,但我再次可以看到我是如何獲得實際行的。逐個單元地設(shè)置每個元素似乎真的很復雜,所以必須有一種完全不同的方式來思考這個我沒有得到的。如果有人可以解釋并告訴我如何做到這一點,我將不勝感激。
查看完整描述

1 回答

?
森林海

TA貢獻2011條經(jīng)驗 獲得超2個贊

代碼示例,希望對您有所幫助:


public class Main extends Application {

    private TableView table = new TableView();

    @Override

    public void start(Stage primaryStage) throws Exception{

        ObservableList<Data> data = FXCollections.observableArrayList(

                new Data("Jacob", "Smith", true),

                new Data("Isabella", "Johnson",true),

                new Data("Ethan", "Williams", false),

                new Data("Emma", "Jones", true),

                new Data("Michael", "Brown", true)

        );

        TableColumn firstDataCol = new TableColumn("Data1");

        firstDataCol.setMinWidth(100);

        firstDataCol.setCellValueFactory(

                new PropertyValueFactory<Data, String>("data1"));


        TableColumn secondDataCol = new TableColumn("Data2");

        secondDataCol.setMinWidth(100);

        secondDataCol.setCellValueFactory(

                new PropertyValueFactory<Data, String>("data2"));


        /*TableColumn isGreenCol = new TableColumn("IsGreen");

        isGreenCol.setMinWidth(200);

        isGreenCol.setCellValueFactory(

                new PropertyValueFactory<Data, Boolean>("isGreen"));*/


        table.setRowFactory(new Callback<TableView<Data>, TableRow<Data>>() {

            @Override

            public TableRow<Data> call(TableView<Data> tableView) {

                final TableRow<Data> row = new TableRow<Data>() {

                    @Override

                    protected void updateItem(Data data, boolean empty){

                        super.updateItem(data, empty);

                        if (data!=null&&data.isGreen.get()) {

                           setStyle("-fx-text-background-color: green;");


                        } else {

                            setStyle("-fx-text-background-color: red;");

                        }

                    }

                };


                return row;

            }

        });


        table.setItems(data);

        table.getColumns().addAll(firstDataCol, secondDataCol);

        Parent window = new VBox();

        ((VBox) window).getChildren().add(new Label("example of small window:"));

        primaryStage.setTitle("example");

        ((VBox) window).getChildren().add(table);

        Scene scene=new Scene(window);

        primaryStage.setScene(scene);

        primaryStage.show();

    }


    public class Data {

        private final SimpleStringProperty data1;

        private final SimpleStringProperty data2;

        private final SimpleBooleanProperty isGreen;


        public Data(String data1, String data2, Boolean isGreen) {

            this.data1 = new SimpleStringProperty(data1);

            this.data2 = new SimpleStringProperty(data2);

            this.isGreen = new SimpleBooleanProperty(isGreen);

        }


        public String getData1() {

            return data1.get();

        }


        public SimpleStringProperty data1Property() {

            return data1;

        }


        public String getData2() {

            return data2.get();

        }


        public SimpleStringProperty data2Property() {

            return data2;

        }


        public boolean isIsGreen() {

            return isGreen.get();

        }


        public SimpleBooleanProperty isGreenProperty() {

            return isGreen;

        }

    }

    public static void main(String[] args) {

        launch(args);

    }

}

輸出畫面:

http://img1.sycdn.imooc.com//61822fdc0001aa4a02650457.jpg

Java Doc對其工作原理的解釋:

設(shè)置行工廠:

產(chǎn)生 TableRow 的函數(shù)。系統(tǒng)負責重用TableRows。從此函數(shù)返回一個 TableRow,它可能可用于表示 TableView 中的單行。

請注意,TableRow不是TableCell。TableRow 只是 TableCell 的容器,在大多數(shù)情況下,您更有可能希望創(chuàng)建自定義 TableCell,而不是 TableRow。創(chuàng)建自定義 TableRow 實例的主要用例很可能是引入某種形式的列跨越支持。

您可以通過將適當?shù)暮瘮?shù)分配給 TableColumn 類中的 cellFactory 屬性,為每列創(chuàng)建自定義 TableCell 實例。@return rowFactory 屬性

以及對一行中每個單元格的 updateItem 調(diào)用:

更新項目:

updateItem 方法不應(yīng)由開發(fā)人員調(diào)用,但它是開發(fā)人員重寫以允許他們自定義單元格的視覺效果的最佳方法。澄清一下,開發(fā)人員永遠不應(yīng)該在他們的代碼中調(diào)用這個方法(他們應(yīng)該把它留給 UI 控件,比如 ListView 控件)來調(diào)用這個方法。但是,擁有 updateItem 方法的目的是讓開發(fā)人員在指定自定義單元工廠(同樣,如 ListView 單元工廠)時,可以覆蓋 updateItem 方法以允許完全自定義單元。Cell 的子類正確覆蓋 updateItem 方法非常重要,因為不這樣做會導致諸如空白單元格或其中出現(xiàn)意外內(nèi)容的單元格等問題。

protected void updateItem(T item, boolean empty) {

            super.updateItem(item, empty);


            if (empty || item == null) {

                setText(null);

                setGraphic(null);

            } else {

                setText(item.toString());

            }

        }

請注意此代碼示例中的兩個重要點: 我們調(diào)用 super.updateItem(T, boolean) 方法。如果不這樣做,則 item 和 empty 屬性設(shè)置不正確,最終可能會出現(xiàn)圖形問題。我們測試空條件,如果為真,我們將文本和圖形屬性設(shè)置為空。如果我們不這樣做,幾乎可以保證最終用戶會意外地看到單元格中的圖形工件。覆蓋:單元格中的 updateItem 參數(shù):數(shù)據(jù) – 單元格的新項目。空 - 此單元格是否代表列表中的數(shù)據(jù)。如果它是空的,那么它不代表任何域數(shù)據(jù),而是一個用于呈現(xiàn)“空”行的單元格。


查看完整回答
反對 回復 2021-11-03
  • 1 回答
  • 0 關(guān)注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號