2016-05-12 11 views
1

共通のListViewではなく、ポップアップ内にカスタムNodeオブジェクトを持つComboBoxを書きたいと思っています。 ColorPickerとDatePickerは良い例です。これはComboBoxBaseの他の2つの実装です。私はComboBoxBaseも簡単に拡張できると思っていましたが、popupPropertyやpopupFactoryがないため、コンテンツを設定する方法がわかりません。それ以外はどうしたらいいのですか?または、ColorPickerとDatePickerがこれをどのようにしていますか?カスタムポップアップを使用したJavaFX ComboBoxの作成

+0

「com.sun.javafx.scene.control.skin.ComboBoxListViewSkin」+スーパークラスを見てください。それらはポップアップの外観を担当するクラスです(使用されているスキンを見つけるために 'Node'のソースコード内の' createDefaultSkin'を探してください) – fabian

+0

人がまだ同じ問題に遭遇した場合、スレッドを動作するコードスニペットで表示します。https://stackoverflow.com/questions/48622453/javafx-create-popover-without-external-libraries –

答えて

2

ComboBoxPopupControlComboBoxBaseSkinには、getPopupContent()が含まれています。それはあなたが探している方法です。 ComboBoxSkinsの1を拡張し、独自の肌の実装では、あなたが好きなポップアップコンテンツを返すことができます私はこのようなcommboxのポップアップを置き換えるためにComtextMenuを使用

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

しかし、なぜあなたは「推奨しない」と言っていますか?リストビューをどのように交換すればいいですか? TableView、TreeViewまたは何か完全に他の? – Arceus

+0

今後のリリースでクラスが変更される可能性があるため、プライベートAPIを使用することはお勧めできません。 http://stackoverflow.com/questions/16874310/need-clarification-of-what-is-this-public-api-in-javafx 'ComboBox'を拡張したいのであれば、他の選択肢はありません。しかし、とにかくリストビューの動作が必要ない場合は、独自のカスタムコントロールを構築するオプションかもしれません – jns

+0

Java 9のスキンAPIを公開しました。だから今ComboBoxPopupControlを拡張すると、良いと有効な可能性があります。 – Arceus

-1

(それはプライベートAPIを使用することをお勧めしませんが):

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); 

正常に動作します。

+0

私はすべてのエラーを修正した後にあなたのコードを試しました。それは効果がありません。空の共通ComboBoxポップアップを表示し、ContextMenuをまったく表示しません。何か忘れましたか? – Arceus

+0

'text.setOnKeyReleased(e - > {//ここにコンテキストメニューを追加}')のようなコードを呼び出すアクションが必要です。 – Rhain

関連する問題