TITLE:JComboBoxのBorderを変更する

Posted by 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));
View in GitHub: Java, Kotlin

解説

  • 上: `MetalComboBoxUI`
    • `UIManager.put("ComboBox.border", border)などで、Borderを変更しているが、UI`独自の余白?を消すことができない
  • 中: `BasicComboBoxUI`
    • `MetalComboBoxUIなどにあった余白は消すことができるが、ComboBox.buttonDarkShadowArrowButton`の三角とボタンの影に使用されているため、両方を一度に非表示にすることができない
  • 下: `BasicComboBoxUI#createArrowButton()`
    • `BasicComboBoxUI#createArrowButton()をオーバーライドして、独自のアイコンをもつJButton`を使用するように変更
    • `JComboBoxMouseListenerを追加して、マウスカーソルがJComboBox内にある場合、ArrowButtonHover`表示されるように設定
combo.addMouseListener(new MouseAdapter() {
  private ButtonModel getButtonModel(MouseEvent e) {
    JComboBox cb = (JComboBox)e.getSource();
    JButton b = (JButton)cb.getComponent(0);
    return b.getModel();
  }
  @Override public void mouseEntered(MouseEvent e) {
    getButtonModel(e).setRollover(true);
  }
  @Override public void mouseExited(MouseEvent e) {
    getButtonModel(e).setRollover(false);
  }
  @Override public void mousePressed(MouseEvent e) {
    getButtonModel(e).setPressed(true);
  }
  @Override public void mouseReleased(MouseEvent e) {
    getButtonModel(e).setPressed(false);
  }
});

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

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

参考リンク

コメント