4

JTable のセル エディタとしてカスタム JComboBox を使用しています。ユーザーがキーボード コントロールを使用してセルに到達すると、ポップアップを開こうとします。これにより、次のエラーが発生します。

java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
    at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1964)
    at java.awt.Component.getLocationOnScreen(Component.java:1938)
    at javax.swing.JPopupMenu.show(JPopupMenu.java:887)
    at javax.swing.plaf.basic.BasicComboPopup.show(BasicComboPopup.java:191)
    at javax.swing.plaf.basic.BasicComboBoxUI.setPopupVisible(BasicComboBoxUI.java:859)
    at javax.swing.JComboBox.setPopupVisible(JComboBox.java:796)

これは既知の問題であり、解決策は次のように設定することであると述べている記事を見てきました。

    comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);

ただし、これは役に立ちません。とにかくこれは何をすることになっていますか?

これについて私が読んだすべてのスレッドと記事は、問題の性質について非常に曖昧です.

この問題が発生する理由の性質について洞察を持っている人はいますか? 私のコンボボックスは非常にカスタムなので、コードを修正できるように問題の基礎を理解するのに役立ちます。

これは、キャプチャされたコンボ ボックスでフォーカスを得たイベントでトリガーされ、setPopupVisible(true); を呼び出します。

 public void focusGained(java.awt.event.FocusEvent e)
 {
        //if focus is gained then make sure we show the popup if it is suppose to be visible
            setPopupVisible(true);
        //and highlight the selected text if any
        comboTextEditor.setCaretPosition(comboTextEditor.getText().length());
        comboTextEditor.moveCaretPosition(0);
 }

ちなみに、Java 1.7_40 と Java 1.6_45 では同じ結果が得られます。

完全なスタック トレース:

Exception in thread "AWT-EventQueue-1" java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
    at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1964)
    at java.awt.Component.getLocationOnScreen(Component.java:1938)
    at javax.swing.JPopupMenu.show(JPopupMenu.java:887)
    at javax.swing.plaf.basic.BasicComboPopup.show(BasicComboPopup.java:191)
    at javax.swing.plaf.basic.BasicComboBoxUI.setPopupVisible(BasicComboBoxUI.java:859)
    at javax.swing.JComboBox.setPopupVisible(JComboBox.java:796)
    at com.mbs.generic.view.swing.combobox.AutoCompleteComboBox$1.focusGained(AutoCompleteComboBox.java:185)
    at java.awt.AWTEventMulticaster.focusGained(AWTEventMulticaster.java:203)
    at java.awt.Component.processFocusEvent(Component.java:6179)
    at java.awt.Component.processEvent(Component.java:6046)
    at java.awt.Container.processEvent(Container.java:2039)
    at java.awt.Component.dispatchEventImpl(Component.java:4653)
    at java.awt.Container.dispatchEventImpl(Container.java:2097)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:901)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:513)
    at java.awt.Component.dispatchEventImpl(Component.java:4525)
    at java.awt.Container.dispatchEventImpl(Container.java:2097)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:648)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:607)
    at java.awt.EventQueue$1.run(EventQueue.java:605)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:621)
    at java.awt.EventQueue$2.run(EventQueue.java:619)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:618)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

ありがとう

4

4 に答える 4

5

まず、何をするのか説明comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);します。通常、項目の上にマウスを移動するか、キーボードの矢印キーを押すと、JComboBoxすぐに項目が選択されます。からの選択イベントJComboBoxによってセル編集プロセスが停止するため、この動作はテーブル セルには適していません。したがって、この特別なクライアント プロパティを設定すると、ポップアップ リスト内で選択された項目が表示されますが、JComboBoxまだ設定されていません。(クリックまたは Enter キーを介して) コミットされたアイテムのみJComboBoxが、編集の終了時に選択されたアイテムを変更します。少なくとも、これはBasicLookAndFeelとその導関数に当てはまります。

あなたが抱えている問題はまったく異なります。例外メッセージとスタック トレースが明確に示しているように、ルック アンド フィールは (要求されたように) にJPopupMenu関連付けられたを開こうとしJComboBoxますが、ポップアップ メニューの画面上の場所を特定できませんJComboBox。画面。の場所が必要な理由JComboBoxは、 に関連する新しいウィンドウを開くためJComboBoxです。

残りの質問は、画面に表示されていないfocusGainedからを受け取ったJComboBox理由 (または表示されたと思った理由) です。

于 2013-09-26T16:12:12.763 に答える
0

私は 2 番目 (3 番目? 4 番目?) に、カスタム コンボボックスを使用したテーブルの簡素化された例を求めています。EditorDelegateのカスタマイズされたバージョンを他のカスタム コードと一緒に作成し、ポップアップを表示するためのコードをfocusGained()デリゲートのstartCellEditing()メソッドに移動しますか?

于 2013-10-02T23:29:04.563 に答える