TITLE:JComboBoxのBorderを変更する

Posted by aterai at 2012-02-20

JComboBoxのBorderを変更する

JComboBoxの表示部分、矢印ボタン、ドロップダウンリストのBorderや色を変更します。

  • &jnlp;
  • &jar;
  • &zip;
ComboBoxBorder.png

サンプルコード

//ComboBox.border
UIManager.put("ComboBox.border", BorderFactory.createLineBorder(Color.WHITE));

//ArrowButton
combo.setUI(new BasicComboBoxUI() {
  @Override protected JButton createArrowButton() {
    JButton b = new JButton(new ArrowIcon()); //.createArrowButton();
    b.setBackground(Color.BLACK);
    b.setContentAreaFilled(false);
    b.setFocusPainted(false);
    b.setBorder(BorderFactory.createEmptyBorder());
    return b;
  }
});

//DropDownList
Object o = combo.getAccessibleContext().getAccessibleChild(0);
((JComponent)o).setBorder(BorderFactory.createMatteBorder(0,1,1,1,Color.WHITE));

解説

  • 上: MetalComboBoxUI
    • UIManager.put("ComboBox.border", border)などで、Borderを変更しているが、UI独自の余白?を消すことができない
  • 中: BasicComboBoxUI
    • MetalComboBoxUIなどにあった余白は消すことができるが、ComboBox.buttonDarkShadow がArrowButtonの三角とボタンの影に使用されているため、両方を一度に非表示にすることができない
  • 下: BasicComboBoxUI#createArrowButton()
    • BasicComboBoxUI#createArrowButton()をオーバーライドして、独自のアイコンをもつJButtonを使用するように変更

java - How do you change border of the pop up section of a JComboBox? - Stack Overflow を参考にして、JComboBoxから以下のように、BasicComboPopupを取得し、Borderを設定

Object o = combo00.getAccessibleContext().getAccessibleChild(0);
((JComponent)o).setBorder(BorderFactory.createMatteBorder(0,1,1,1,Color.WHITE));

参考リンク

コメント