日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java fx listview,JavaFX 8自定义ListView单元它是邪恶的

發布時間:2023/12/15 java 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java fx listview,JavaFX 8自定义ListView单元它是邪恶的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看起來你想要一個ControlsFX

PropertySheet:

類似的實現是在JavaFX 2 TableView : different cell factory depending on the data inside the cell的答案中.盡管該問題的答案基于TableView,ListView和TableView都是虛擬化控件,因此實現概念有點類似于在問題中概述的使用帶有HBox的ListView.

根據問題的示例代碼進行更新.

我仍然認為ControlsFX PropertySheet似乎是您嘗試完成的最合適的解決方案.像ListView一樣使用虛擬控件來完成這樣的任務只會讓事情變得比他們需要的更復雜.

基于ListView的屬性編輯器的完整解決方案是一個相當復雜的事情,超出了StackOverflow答案中可合理提供的范圍.

您在問題中提供的示例代碼存在一些問題. ListView是一個虛擬化控件,因此您不應創建新的圖形節點,以便在調用更新時始終放在ListView中.會發生什么是TextField獲得焦點,然后在ListView上調用update并創建一個新的TextField,默認情況下新的TextField沒有焦點.

我認為ListView本身對于您的特定情況有一些實現問題,并且調用更新次數太多了.無論如何,您應該編寫代碼,以便在單個單元格上適當地處理多次調用的更新.如果你這樣做,ListView調用你的方法的次數多于它需要的時間并不重要.

以下是一些示例代碼,可以幫助您取得更多進展.我不相信示例代碼是您問題的完整解決方案,它當然不是作為Java對象的綜合屬性編輯器提供的,但它可能會給您一些靈感來幫助改進和實現您的代碼(假設您決定繼續嘗試以這種方式解決這個問題).如果繼續使用ListView,您可能需要查看ListView的編輯例程(類似于Oracle JavaFX教程中為editing table cells定義的內容).

import javafx.application.Application;

import javafx.beans.value.ChangeListener;

import javafx.collections.FXCollections;

import javafx.scene.Scene;

import javafx.scene.control.*;

import javafx.stage.Stage;

import java.lang.reflect.Field;

import java.time.LocalDate;

/**

* @author dmitrynelepov

* Modified by Jewelsea

*/

public class EvilHasSurvived extends Application {

static class TestClassForListView {

public String fieldString;

public LocalDate fieldDate;

@Override

public String toString() {

return "TestClassForListView{" +

"fieldString='" + fieldString + '\'' +

", fieldDate=" + fieldDate +

'}';

}

}

static class MyListCell extends ListCell {

private TextField textField;

private DatePicker datePicker;

private Object editedObject;

private ChangeListener editCommitHandler;

public MyListCell(Object editedObject) {

this.editedObject = editedObject;

setContentDisplay(ContentDisplay.RIGHT);

}

@Override

protected void updateItem(Field t, boolean bln) {

super.updateItem(t, bln);

if (datePicker != null) {

datePicker.focusedProperty().removeListener(editCommitHandler);

}

if (textField != null) {

textField.focusedProperty().removeListener(editCommitHandler);

}

if (t == null) {

setText(null);

setGraphic(null);

return;

}

if (t.getType().equals(String.class)) {

if (textField == null) {

textField = new TextField();

}

editCommitHandler = (observable, oldValue, newValue) -> {

try {

t.set(editedObject, textField.getText());

System.out.println(editedObject + " for " + textField + " value " + textField.getText());

} catch (IllegalAccessException e) {

e.printStackTrace();

}

};

textField.focusedProperty().addListener(editCommitHandler);

setText(t.getName());

setGraphic(textField);

} else if (t.getType().equals(LocalDate.class)) {

if (datePicker == null) {

datePicker = new DatePicker();

}

editCommitHandler = (observable, oldValue, newValue) -> {

try {

t.set(editedObject, datePicker.getValue());

System.out.println(editedObject + " for " + datePicker + " value " + datePicker.getValue());

} catch (IllegalAccessException e) {

e.printStackTrace();

}

};

datePicker.focusedProperty().addListener(editCommitHandler);

setText(t.getName());

setGraphic(datePicker);

}

}

}

@Override

public void start(Stage stage) throws Exception {

ListView listView = new ListView<>();

listView.setItems(

FXCollections.observableArrayList(

TestClassForListView.class.getFields()

)

);

TestClassForListView testObject = new TestClassForListView();

listView.setCellFactory(p -> new MyListCell(testObject));

stage.setScene(new Scene(listView));

stage.show();

}

public static void main(String[] args) {

launch(args);

}

}

總結

以上是生活随笔為你收集整理的java fx listview,JavaFX 8自定义ListView单元它是邪恶的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。