JavaFX 8 Benutzerdefinierte ListView-Zellen ist es das Böse
Habe ich custom ListView-Zelle habe ich HBox mit zwei Steuerelementen:
- Etikett mit Namensfeld
- Es muss generiert sich aus Kontext-Objekt
Beispielsweise ich ListView-Elemente array von Class-Felder, wenn das Feld Typ Boolean erstelle ich Kontrollkästchen, wenn die Zeichenfolge, die ich erstellen TextField und etc.
Problem ist: ich bekomme Field-Objekt nur in der Methode updateItem() - und nur dort kann ich meine Steuerelemente.
In JavaFX 7 alles Prima funktioniert, aber auf Java-8 - ich sehe nicht ein, meine Steuerelemente.
Ist, besteht die richtige Lösung für meinen Fall?
UPDATE 1
Hier die komplette Beispiel für replizieren problem:
package javafx8listviewexample;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.Date;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.DatePicker;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.TextFieldListCell;
import javafx.util.Callback;
/**
*
* @author dmitrynelepov
*/
public class FXMLDocumentController implements Initializable {
static class TestClassForListView {
public String fieldString;
public Date fieldDate;
}
static class MyListCell extends ListCell<Field> {
/**
* As in tutorial
*
* @param t
* @param bln
*/
@Override
protected void updateItem(Field t, boolean bln) {
super.updateItem(t, bln);
if (t != null) {
if (t.getType().equals(String.class)) {
System.out.println("Draw string");
setGraphic(new TextField(t.getName()));
} else if (t.getType().equals(Date.class)) {
System.out.println("Draw Date");
setGraphic(new DatePicker());
}
}
}
}
@FXML
private ListView<Field> listView;
@FXML
private void handleButtonAction(ActionEvent event) {
this.listView.getItems().clear();
this.listView.setItems(
FXCollections.observableArrayList(
TestClassForListView.class.getFields()
)
);
}
@Override
public void initialize(URL url, ResourceBundle rb) {
this.listView.setCellFactory(new Callback<ListView<Field>, ListCell<Field>>() {
@Override
public ListCell<Field> call(ListView<Field> p) {
return new MyListCell();
}
});
}
}
Hier screenshot-Programm JDK 7
wie u sehen kann ich TextField fokussiert werden kann und bearbeitet.
Aber wenn ich dieses Beispiel ausführen mit JDK 8 bekam ich
als hier u können, finden Sie unter TextField kippe werden fokussiert und bearbeitet.
- Komplett, minimale code zum replizieren Ihre Frage ist wichtig für die Analyse. Wenn Sie weitere Hilfe mit Ihren besonderen Einsatz und möchte jemanden zu untersuchen und zu erklären, warum es nicht funktioniert, müssen Sie code zu replizieren, das Problem in einer Frage bearbeitet, wie eine SSCCE.
- Während die Frage ist sehr nützlich, könnten Sie bitte aktualisieren Sie die Titel? Es sollte genauer zu reflektieren, was man so böse über benutzerdefinierte ListCell Objekte in javafx8.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie Sie wollen, eine ControlsFX PropertySheet:
Eine ähnliche Umsetzung, ist in der Antwort auf JavaFX 2 TableView : andere Zelle Fabrik abhängig von den Daten in der Zelle. Obwohl die Antwort auf diese Frage basiert auf TableView, beide ListView und TableView virtualisierten Steuerungen, also die Umsetzung-Konzept ist ähnlich wie mit einem ListView mit einem HBox-wie bereits in Ihrer Frage.
Update basiert auf Beispiel-code aus Frage.
Ich denke immer noch, dass ein ControlsFX PropertySheet scheint die am besten geeignete Lösung für das, was Sie versuchen zu erreichen. Mithilfe einer Virtualisierten Kontrolle, wie ein ListView für eine solche Aufgabe einfach macht die Dinge komplizierter als Sie sein müssen.
Eine vollständige Lösung für ein ListView-basierte property editor ist eine ziemlich komplexe Sache, und außerhalb der Umfang dessen, was vernünftigerweise in einer StackOverflow-Antwort.
Den Beispiel-code, den Sie in Ihrer Frage einige Probleme hat. Die ListView ist eine virtualisierte Steuern, so sollten Sie es nicht schaffen, neue Grafik-Knoten in der ListView die ganze Zeit, dass update aufgerufen wird. Was passiert, ist, dass ein TextField-Objekt den Fokus erhält, dann update aufgerufen in der Listenansicht und erstellen Sie ein neues TextField und standardmäßig die new TextField nicht im Fokus ist.
Ich denke, dass die ListView selbst hat einige Fragen der Umsetzung für Ihren speziellen Fall und aufrufen von update zu viele Male. Unabhängig davon, sollten Sie Ihren code schreiben, so dass Sie entsprechend verarbeitet update aufgerufen wird mehrfach auf einer einzelnen Zelle und. wenn Sie dies tun, es wird nicht egal, wenn ListView ruft Ihre Methode mehr Zeit, als es muss.
Ist hier einige Beispiel-code, die helfen können Sie machen mehr Fortschritte. Ich glaube nicht, dass der Beispiel-code ist eine komplette Lösung für Ihr Problem, es ist sicherlich nicht als eine umfassende Eigenschaft-editor für Java-Objekte, aber vielleicht kann es Ihnen etwas inspiration zu helfen, Verbesserung und Umsetzung Ihres code (sofern Sie sich entscheiden, weiterhin versuchen dieses problem zu lösen, auf diese Weise). Wenn Sie weiterhin mit ListView, möchten Sie vielleicht einen Blick in die editing-Routinen für das ListView-Steuerelement (ähnlich zu dem, was definiert ist, für die Bearbeiten von Tabellenzellen in der Oracle JavaFX-tutorials).