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单元它是邪恶的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenAI 首席技术官:下一版 Cha
- 下一篇: 前景超特斯拉汽车 马斯克:人形机器人数量