1

これは重複かもしれませんが、正確にはわかりませんが、基本的には、独自の ListCellRenderer を提供して JComboBox の表示をカスタマイズしようとしています。

targetCombo = new JComboBox();
targetCombo .setRenderer(new BasicComboBoxRenderer(){
    public Component getListCellRendererComponent(JList list, Object value, int index,              boolean isSelected, boolean cellHasFocus){
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (value != null){
            MyObj myObj = (myObj)value;
            setText(myObj.getName());
        }
        return this;
    }
});

JComboBox リストを展開すると、コンポーネントは適切に名前を表示します。ただし、項目を選択すると、表示は myObj の toString() 値に戻ります。

何か不足していますか?

4

2 に答える 2

4

BasicComboBoxRendererの使用を次のように置き換えますDefaultListCellRenderer

public class TestComboBox04 {

  public static void main(String[] args) {
    new TestComboBox04();
  }

  public TestComboBox04() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
        }

        JComboBox targetCombo = new JComboBox();
        targetCombo.setRenderer(new DefaultListCellRenderer() {
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value != null) {
              MyObj myObj = (MyObj) value;
              setText(myObj.getName());
            }
            return this;
          }
        });
        targetCombo.addItem(new MyObj("A"));
        targetCombo.addItem(new MyObj("B"));
        targetCombo.addItem(new MyObj("C"));
        targetCombo.addItem(new MyObj("D"));

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridBagLayout());
        frame.add(targetCombo);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

      }
    });
  }

  public class MyObj {

    private String name;

    public MyObj(String name) {
      this.name = name;
    }

    public String getName() {
      return name;
    }

  }

}

独自のルック アンド フィールを作成する予定がない限り、ルック アンド フィール パッケージのコンポーネントを使用する必要はありません。

于 2013-01-21T22:16:16.093 に答える
0

...表示は myObj の toString() 値に戻ります。

特定の何かのために toString() が必要でない限り、それをオーバーライドして「名前」を返します。

その後、レンダラーは必要ありません-コンボボックスは toString() 値を表示します

于 2013-01-22T04:20:21.687 に答える