10

ある時点で無効にする必要のあるJComboBoxがありますが、disabledコントラストが低いため、ステータスが非常に読みにくくなっていると感じています。

ボックスレンダラーを有効にしたまま、ドロップダウン矢印ボタンのみが無効として表示されると便利です。

実際:実際のコンボ望ましい:望ましい結果

これまたは類似のものを達成する簡単な方法はありますか?

ありがとう!

4

5 に答える 5

7

BasicComboBoxUIを覗いてしまいましたが、ここで次のことがわかりました。

        if ( comboBox.isEnabled() ) {
            c.setForeground(comboBox.getForeground());
            c.setBackground(comboBox.getBackground());
        }
        else {
            c.setForeground(DefaultLookup.getColor(
                     comboBox, this, "ComboBox.disabledForeground", null));
            c.setBackground(DefaultLookup.getColor(
                     comboBox, this, "ComboBox.disabledBackground", null));
        }

setForegroundそのため、レンダラーコンポーネントとして、何もしないようにオーバーライドされたメソッドを持つJLabelを使用しました。したがって、色が変更されることはなく、デフォルトの黒の値が維持されます。

問題は、このトリックが実装固有であるということです。特定のLook&FeelまたはUI Managerは、コンポーネントの色を変更する代わりに、半透明のレイヤーでオーバーペイントして無効なアイテムを表示するなど、他のことを行う場合があります:-(

setForegroundインストールされているL&FまたはUI Managerがメソッドを呼び出さない場合、テストで少なくとも警告が表示される可能性があります。

于 2011-01-28T12:02:51.583 に答える
7

これがあなたが持っている別のオプションです:

    jComboBox1.setRenderer(new DefaultListCellRenderer() {
        @Override
        public void paint(Graphics g) {
            setForeground(Color.BLACK);
            super.paint(g);
        }
    });

インスタンス化後にこのコードを追加する必要があります。文字は常に黒のままになります。無効または有効にすると、コンボボックスのフレームが灰色または黒に変わります。

彼らはこのように見えます:

ここに画像の説明を入力してください

于 2011-01-28T15:57:04.940 に答える
7

Michael Grimesによる別のハックがありますが、これは特定のルックアンドフィールの影響を受けないはずです。秘訣は、コンボボックスを編集可能にすることです。JTextFieldこれは、エディターがsetDisabledTextColorメソッドをサポートしているときに公開されます。また、コンボボックスを無効にしているので、編集可能であるかどうかは関係ありません。これを行うために使用しているコード(Scalaから翻訳)は次のとおりです。

JComboBox cb = ...;
...
cb.setEditable(true);
ComboBoxEditor editor = cb.getEditor()
JTextField     etf    = (JTextField)etf.getEditorComponent()
etf.setDisabledTextColor(UIManager.getColor("ComboBox.foreground"));
etf.setBackground(UIManager.getColor("ComboBox.background"));
// editor.setItem(format(obj));
cb.setEnabled(false);

を使用しているため、キャストはここで成功することが保証されています。BasicComboBoxEditorそのドキュメントには、「エディターはJTextFieldとして実装されています」と記載されています。コメントアウトされた行は、整数を余分なテキストで囲んで印刷するカスタムレンダラーを使用しているために発生します。呼び出すとsetItem、同様の文字列を指定できます。これは、エディターがカスタムレンダラーを無視するために必要です。デフォルトのレンダラーを使用している場合は、その行について心配する必要はありません。一方、より複雑なレンダラーを使用している場合は、まったく別のことを行う必要があるかもしれません。

これは恐ろしい恨みであるという事実にもかかわらず、それは機能し、実装で定義された機能に依存していないようです。この破損を想像できる2つの場所は、(a)編集可能なコンボボックスが編集不可能なコンボボックスと大きく異なる場合です(たとえば、最初の試みでテキストフィールドの背景色が変更されなかったため、見栄えが悪くなりました) 、または(b)aBasicComboBoxEditorを返すのをやめた場合JTextField(可能性は低いようです)。しかし、これまでのところ、それは私の目的を果たしています。

于 2011-07-22T23:01:19.930 に答える
6

これを試して **

UIManager.put( "ComboBox.disabledBackground", new Color(212,212,210) );
UIManager.put( "ComboBox.disabledForeground", Color.BLACK );

****

于 2012-08-08T10:39:40.600 に答える
0

結果は、次のコードで実現できます。

    Component editorComponent = comboBox.getEditor().getEditorComponent();
    if(editorComponent instanceof JTextComponent){
        ((JTextComponent)editorComponent).setDisabledTextColor(Color.black);
    }

いくつかのL&Fでテストしませんでしたが、PropertyChangeイベント( "disabledTextColor")が発生するため、違いが生じる可能性があります。ドキュメントを参照してください 。

于 2014-04-25T10:37:16.437 に答える