2016-05-12 13 views
1

Ich möchte eine ComboBox mit einem benutzerdefinierten Node-Objekt in seinem Popup (anstelle der üblichen ListView) schreiben. ColorPicker und DatePicker sind gute Beispiele, die die anderen beiden Implementierungen von ComboBoxBase sind. Ich dachte, ich könnte ComboBoxBase auch einfach erweitern, aber da es keine popupProperty oder popupFactory gibt, weiß ich nicht, wie ich den Inhalt einstellen soll. Wie sonst soll es gemacht werden? Oder wie ColorPicker und DatePicker das machen?Erstellen Sie JavaFX ComboBox mit benutzerdefinierten Popup

+0

Schauen Sie sich 'com.sun.javafx.scene.control.skin.ComboBoxListViewSkin' + superclasses an. Das sind die Klassen, die für das Aussehen des Popups verantwortlich sind ... (suche nach 'createDefaultSkin' im Quelltext eines' Node' um den verwendeten Skin zu finden) – fabian

+0

Nur für den Fall, dass Leute immer noch das gleiche Problem haben, hier ist ein Thread mit einem funktionierenden Codeausschnitt: https://stackoverflow.com/questions/48622453/javafx-create-popover-without-external-libraries –

Antwort

2

ComboBoxPopupControl die erweitert ComboBoxBaseSkin enthält getPopupContent(). Das ist die Methode, nach der Sie suchen. In der eigenen Haut-Implementierung, die eine der ComboBoxSkins erstreckt, können Sie den Popup-Inhalt zurückkehren Sie (obwohl es nicht empfohlen werden privaten API zu verwenden)

public class CustomComboBox<T> extends ComboBox<T> { 

     @Override 
     protected Skin<?> createDefaultSkin() { 
      return new CustomComboBoxSkin<>(this); 
     } 
} 

public class CustomComboBoxSkin<T> extends ComboBoxPopupControl<T> { 

     public CustomComboBoxSkin(ComboBox<T> comboBox) { 
      super(comboBox, new CustomComboBoxBehaviour<>(comboBox)); 
     } 

     @Override 
     public Node getPopupContent() { 
      return new Rectangle(150, 200); 
     } 

     // inherited methods ... 

} 
+0

Ich sehe. Aber warum sagst du "nicht empfohlen"? Ich meine, wie sonst sollte ich das ListView mit z. ein TableView, TreeView oder etwas ganz anderes? – Arceus

+0

Es wird nicht empfohlen, private API zu verwenden, da sich die Klassen in einer zukünftigen Version ändern können, was wiederum Ihren Code bremsen kann. http://StackOverflow.com/Questions/16874310/Need-clarification-of-what-is-this-public-api-in-javafx. Wenn Sie 'ComboBox' erweitern möchten, gibt es keine andere Wahl. Aber wenn Sie das Listview-Verhalten sowieso nicht brauchen, ist es vielleicht eine Option, Ihr eigenes benutzerdefiniertes Steuerelement zu erstellen – jns

+0

Mit Java 9 wurde die Haut-API veröffentlicht. Das Erweitern von ComboBoxPopupControl ist also eine gute und gültige Möglichkeit. – Arceus

-1

I ComtextMenu verwendet, um die CommBox des Popup wie folgt zu ersetzen:

ContextMenu menu = new ContextMenu(); 
MenuItem item = new MenuItem(); 
item.setGraphic(new Lable("test")); 
menu.getItems.add(item); 
commbox.setContextMenu(null); 
commbox.setContextMenu(menu); 
commbox.getContextMenu().show(comboBox, Side.BOTTOM, 0, 0); 

Es funktioniert gut.

+0

Ich habe versucht, Ihren Code (nach der Korrektur aller Fehler). Es hat keine Wirkung. Zeigt das leere allgemeine ComboBox-Popup und kein ContextMenu an. Etwas vergessen? – Arceus

+0

Sie benötigen eine Aktion, um den Code aufzurufen, wie 'text.setOnKeyReleased (e -> {// add conferenmenu here})' '. – Rhain

Verwandte Themen