2

私が望んでいるのは、編集可能な JCombobox に入力すると、 JComboboxポップアップ メニュー自動的に表示されることです。しかし、矢印ボタンアイコンを変更すると、写真に示すように機能しなくなりましたJCombobox

矢印ボタンアイコン変更前

ここに画像の説明を入力

矢印ボタンのアイコンを変更した後(ポップアップは表示されませんJCombobox

ここに画像の説明を入力

これは私がしたことです:

JTextComponent editor;
/** Creates new form combo */
public combo() {
    initComponents();

    editor = (JTextComponent) jComboBox1.getEditor().getEditorComponent();
    jComboBox1.setEditable(true);

    editor.addKeyListener(new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {

            char keyChar = e.getKeyChar();
            if (jComboBox1.isDisplayable()) 
            { 
                jComboBox1.setPopupVisible(true);    
            }
            editor.setCaretPosition(editor.getText().length());

            //  System.out.println("wwwweeeee"+keyChar);
        }
    });    

    jComboBox1.setUI(new SynthComboBoxUI() {
        protected JButton createArrowButton() {

            JButton btn = new JButton();
            btn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Image/error3.png")));            
            return btn;
        }
    });
}    

解決策を探すのに本当に疲れているので、助けてください

4

1 に答える 1

5

ここでの技術的な問題は、エディターが UI によって作成/維持されることです。カスタム UI を設定すると、新しいエディターに置き換えられるため、コンテナー階層の一部ではなくなったコンポーネントをリッスンしています。

少し掘り下げた後...私はまだ解決策を持っていません:-(額面どおり、エディターにリスナーをインストールする前にsetUIを呼び出します-しかし、 setUIの呼び出しは常に間違っています...だから、そうしないでください.

UI がシンセベースであることを確認すると、視覚的なフォア/バックグラウンド プロパティを更新する正しい方法は、アプリケーションごとまたはインスタンスごとにカスタム ペインタを提供することです。Nimbus では、「Nimbus.Overrides」クライアント プロパティを介して、インスタンスごとのカスタム UIDefaults をインストールできます。矢印ボタンのアイコンを変更する場合、適切なオーバーライドは次のようになります。

Painter core = // a custom painter which paints the icon 
comboDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", core);
combo.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
combo.putClientProperty("Nimbus.Overrides", comboDefaults);

動作していないことを除いて、すべて問題ありません-オーバーライドが子に適切にインストールされていないようです。

編集 2

... 時間後 ...

利用可能なすべてのリソースから、上記は機能するはずです。カスタムプロパティの定義方法に関する Jasper の最初の説明を参照してください。

ComponentA:ChildComponentB.foreground を使用すると、ComponentA に含まれる ChildComponentB を指定できます。

だから私はそれが本当にバグだと思う。ボタン自体にオーバーライドをインストールするのは、あまり満足のいく方法ではありません。

JButton org = null;
for (int i = 0; i < combo.getComponentCount(); i++) {
    if (combo.getComponent(i) instanceof JButton) {
        org = (JButton) combo.getComponent(i);
        UIDefaults buttonDefaults = new UIDefaults();
        buttonDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", painter);
        org.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
        org.putClientProperty("Nimbus.Overrides", buttonDefaults);
        break;
    }
}

ボタンの作成は ui デリゲートによって制御されるため、この構成は LAF の切り替え後は存続しません。またはその逆: UIManager を使用して PropertyChangeListener をインストールし、Nimbus への切り替えを検出したら、オーバーライドをコンボからその子に手動でコピーする必要があります。

于 2012-08-21T07:50:21.753 に答える