• category: swing folder: RoundedDropDownList title: JComboBoxのドロップダウンリストに角丸のBorderを設定する tags: [JComboBox, BasicComboPopup, JPopupMenu, Border] author: aterai pubdate: 2016-01-11T00:02:17+09:00 description: JComboBoxからBasicComboPopupを取得し、これに角丸のBorderを設定します。 image: https://lh3.googleusercontent.com/-hO6OrwNE6O4/VpJu21j7FbI/AAAAAAAAOLA/mUBgzYUJpes/s800-Ic42/RoundedDropDownList.png

概要

JComboBoxからBasicComboPopupを取得し、これに角丸のBorderを設定します。

サンプルコード

JComboBox<String> combo1 = new JComboBox<String>(makeModel()) {
  private transient PopupMenuListener listener;
  @Override public void updateUI() {
    removePopupMenuListener(listener);
    UIManager.put("ComboBox.border", new RoundedCornerBorder());
    super.updateUI();
    setUI(new BasicComboBoxUI());
    listener = new HeavyWeightContainerListener();
    addPopupMenuListener(listener);
    Object o = getAccessibleContext().getAccessibleChild(0);
    if (o instanceof JComponent) {
      JComponent c = (JComponent) o;
      c.setBorder(new RoundedCornerBorder());
      c.setForeground(FOREGROUND);
      c.setBackground(BACKGROUND);
    }
  }
};
View in GitHub: Java, Kotlin

解説

  • 上:
    • UIManager.put(...)で背景色などを変更し、BasicComboBoxUIを設定したJComboBox
  • 中:
    • 上のJComboBoxから、getAccessibleContext().getAccessibleChild(0)BasicComboPopupを取得し、角丸のBorderを設定
    • JComboBoxPopupMenuListenerを追加し、ドロップダウンリストがJFrameの外側にはみ出す(HeavyWeightContainerJWindowJPopupMenuが配置されている)場合は、JWindowの背景を透明化して角丸部分を非表示に設定
  • 下:
    • 中のJComboBoxと同様にBasicComboPopupを取得し、下辺のみ角丸のBorderを設定(JComboBox自体には上辺のみ角丸のBorderを設定)
    • ArrowButtonを変更

参考リンク

コメント