6

デフォルトでは、JavaFXには「undo」、「copy」、「cut」などのオプションTextFieldが組み込まれています。編集可能として設定されている場合も同じです(実際にはエディタの一部であるContextMenu)。ComboBoxContextMenuComboBoxTextField

これをカスタムのものに置き換えたいContextMenuのですが、デフォルトのものを無効にするのに問題があります。

ContextMenuおよびマウスクリックイベントを使用しようとしましたがComboBoxComboBox.getEditor()両方ともnullがありますContextMenu

私は何かが足りないのですか?

4

3 に答える 3

7

デフォルトのポップアップ メニューを無効にする方法を見つけました。次に、二重メニュー効果を得ることなく、独自のものを追加できます。

ComboBox<String> cb_ = new ComboBox<>();
final EventDispatcher initial = cb_.getEditor().getEventDispatcher();
cb_.getEditor().setEventDispatcher(new EventDispatcher()
{
    @Override
    public Event dispatchEvent(Event event, EventDispatchChain tail)
    {
        if (event instanceof MouseEvent)
        {
            //shot in the dark guess for OSX, might not work
            MouseEvent mouseEvent = (MouseEvent)event;
            if (mouseEvent.getButton() == MouseButton.SECONDARY || 
                    (mouseEvent.getButton() == MouseButton.PRIMARY && mouseEvent.isControlDown()))  
            {
                event.consume();
            }
        }
        return initial.dispatchEvent(event, tail);
    }
});

注 - コンボボックスのメニューを介して独自のメニューを追加していません。それが機能するかどうかはわかりません (可能性があります)。

コンボボックスを Hbox でラップし、hbox にメニューを追加すると、うまくいくことがわかります。

HBox hbox = new HBox();
ContextMenu contextMenu = new ContextMenu();
....
hbox.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>()
{
    @Override
    public void handle(ContextMenuEvent event)
    {
        contextMenu.show(hbox, event.getScreenX(), event.getScreenY());
    }
});
于 2013-03-13T05:49:57.387 に答える
2

すでに述べたように、呼び出しGetContextMenu()は null を返します (これは、デフォルトのものは実装の詳細であるという大きな手がかりです)。さらに追加するContextMenuと、デフォルトのものの上に表示されます。

コンテキスト メニューを次のコードに置き換えようとしています。

ContextMenu cm = new ContextMenu();
cm.getItems().add(new MenuItem("Test"));

textbox.setContextMenu(cm);

次の結果が生成されます。

ここに画像の説明を入力

マウス クリック イベントのオーバーライドも機能しません。これは、不可能と思われるプロパティを介してデフォルトのコンテキスト メニューにアクセスする必要があるためです。

また、CSS リファレンスをチェックしてContextMenu、コントロールのサブ構造の 1 つを介してターゲット可能かどうかを確認しましたが、これも結果が返されませんでした。

この情報に基づいて、デフォルトContextMenuTextFieldコントロールの実装の詳細 (または親クラスTextInputControl) であり、現在変更できないように見えます。

アップデート

私は、Jonathan Giles (Oracle の JavaFX UI コントロール チームのテクニカル リード) に連絡し、バグ レポートを提出するように言われました。

バグ データベースを検索したところ、いくつかの既存のレポート (RT-23213 & RT-24823) が見つかったため、これは既知の問題のようです。今日現在、この問題は未解決であり、中程度の優先度と見なされていますが、FX 8.0 で修正される予定です。

バグレポートのコメントから:

デフォルトのコンテキスト メニューは、現在パブリック API ではないコントロールのスキンによって作成されます。パブリック API を介してコンテキスト メニューにアクセスできるようにするかどうか、いつアクセスできるようにするかを決定する必要がありますが、スキンをより公開するためのより広範な作業を待つ必要があるでしょう。

于 2012-11-26T23:21:43.040 に答える