TITLE:JComboBoxのItemを左右にクリップして配置

JComboBoxのItemを左右にクリップして配置

Posted by terai at 2005-09-12

概要

JComboBoxのItemにテキストをクリップして左右に分けて配置します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

class MyCellRenderer extends JPanel implements ListCellRenderer {
  private final JLabel lbl1 = new JLabel();
  private final JLabel lbl2 = new JLabel();
  private final Color  cfc  = UIManager.getColor("ComboBox.foreground");
  private final Color  cbc  = UIManager.getColor("ComboBox.background");
  private final Color  csfc = UIManager.getColor("ComboBox.selectionForeground");
  private final Color  csbc = UIManager.getColor("ComboBox.selectionBackground");
  private final Color  cdfc = UIManager.getColor("ComboBox.disabledForeground");
  public MyCellRenderer(Dimension dim, int rightw) {
    super(new BorderLayout());
    lbl1.setOpaque(true);
    lbl2.setOpaque(true);
    this.setOpaque(true);
    lbl1.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
    lbl2.setPreferredSize(new Dimension(rightw, 0));
    lbl2.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
    this.add(lbl1);
    this.add(lbl2, BorderLayout.EAST);
    this.setPreferredSize(dim);
  }
  public Component getListCellRendererComponent(
                    JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus) {
    LRItem item = (LRItem)value;
    lbl1.setText(item.getLeftText());
    lbl2.setText(item.getRightText());
    lbl1.setBackground(isSelected ? csbc : cbc);
    lbl2.setBackground(isSelected ? csbc : cbc);
    this.setBackground(isSelected ? csbc : cbc);
    lbl1.setForeground(isSelected ? csfc : cfc);
    lbl2.setForeground(cdfc);
    return this;
  }
}

解説

上記のサンプルでは、JLabelを二つ並べたJPanelをレンダラーにすることで、Itemに設定した文字列を左右に表示しています。このため文字列が長い場合、JLabelがこれを自動的にクリップしてくれます。

参考リンク

コメント