0

CustomerJComboBox から選択できるようにする必要があるオブジェクトのリストがあります。私が読んだことから、カスタムレンダラーを実装して、リストに表示したいフィールドを表示する必要があります。

JComboBox のエントリを次のようにフォーマットしたい:

+----------------------------------------------+
|  Customer Name - Contact - City, State    V  |
+==============================================+
|  Customer #2 Name - Contact - City, State    |
|  Customer #3 Name - Contact - City, State    |
|  Customer #4 Name - Contact - City, State    |
|  Customer #5 Name - Contact - City, State    |
+----------------------------------------------+

私はこのコードを使用しました:

public class CustomerListCellRenderer extends DefaultListCellRenderer {

@Override
public Component getListCellRendererComponent(
        JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    if (value instanceof Customer) {
        Customer c = (Customer) value;

        StringBuffer sb = new StringBuffer();
        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getCompany());
        }
        sb.append(" - ");
        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getContact());
        }
        sb.append(" - ");
        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getCity());
            sb.append(", ");
        }            
        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getState());
        }

        setText(sb.toString());
    }
    return this;
  }
}

これは、システム GTKLookAndFeel を使用する Solaris / Unix / Linux では正しく機能しません。コンボボックスの入力領域の背景は描画されず、その周りに境界線も描画されません。(下のスクリーンショットを参照)。3 つの主要なプラットフォーム (Win/Mac/GTK) で正しく動作する、これを実現する別の方法はありますか? これを行うコンバーターを作成して、GUI ではなくデータのみを操作することはできますか?

私の現在の回避策は、 Customer オブジェクトの toString() をオーバーライドして、各レコードを必要な形式で表示することですが、他のアイデアを探しています。

代替テキスト

ニック

4

3 に答える 3

2

同じ問題、アイコンを表示するようにカスタマイズするためにこれを行いました:

private static class CustomComboBoxRenderer extends DefaultListCellRenderer
{
    private final ListCellRenderer backend;

    public CustomComboBoxRenderer(ListCellRenderer backend)
    {
        this.backend = backend;
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        Component component = backend.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if(component instanceof JLabel == false)
            component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        JLabel label = (JLabel)component;
        label.setIcon(Icons.COMPONENT);
        return label;
    }
}

次に、次のようにレンダラーを割り当てます。

comboBox.setRenderer(new CustomComboBoxRenderer(comboBox.getRenderer()));

これまでのところ、これはうまくいきました。

于 2010-08-12T02:18:34.677 に答える
1

これを試して:

public Component getListCellRendererComponent(
        JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    if (value instanceof Customer) {
        Customer c = (Customer) value;

        StringBuffer sb = new StringBuffer();
        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getCompany());
        }
        sb.append(" - ");
        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getContact());
        }
        sb.append(" - ");
        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getCity());
            sb.append(", ");
        }            
        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getState());
        }

        value = sb.toString();
    } 
    return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
  }
}

また、StringBuffer ではなく StringBuilder を使用します (これはシングル スレッドの状況です)。

また、たとえば、コードにカット アンド ペースト エラーがあるようにも見えます。

        if (c.getCompany() != null && c.getCompany().length() > 0) {
            sb.append(c.getState());
        }

Company メンバーをチェックし、State メンバーを使用しています。

于 2009-06-27T08:14:58.537 に答える
0

DefaultListCellRendererは JLabel を拡張し、JLabel のように見えます。編集不可能な ComboBox がある場合、getRenderer を介して返される Renderer は、ドロップダウン リスト領域の描画と「入力」領域に使用されます。ComboBox とレンダラーの境界線/前景/背景設定で遊んでみてください。

于 2009-06-27T08:07:46.913 に答える