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.buttonDarkShadow がArrowButtonの三角とボタンの影に使用されているため、両方を一度に非表示にすることができない
  • 下: BasicComboBoxUI#createArrowButton()
    • BasicComboBoxUI#createArrowButton()をオーバーライドして、独自のアイコンをもつJButtonを使用するように変更
    • JComboBoxにMouseListenerを追加して、マウスカーソルがJComboBox内にある場合、ArrowButtonがHover表示されるように設定
      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));

参考リンク

コメント