JComboBoxのBorderをドロップダウンリストの表示状態で切り替える
Total: 400
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JComboBox
のBorder
をドロップダウンリストの表示状態で切り替えて左右の辺が直線で描画されるよう設定します。
Screenshot
Advertisement
サンプルコード
JComboBox<String> combo1 = new JComboBox<String>(model) {
private transient PopupMenuListener listener;
@Override public void updateUI() {
setRenderer(null);
removePopupMenuListener(listener);
super.updateUI();
setBorder(new RoundedCornerBorder());
setRenderer(new RoundedCornerListCellRenderer());
setUI(new BasicComboBoxUI() {
// ...
}
listener = new HeavyWeightContainerListener();
addPopupMenuListener(listener);
Object o = getAccessibleContext().getAccessibleChild(0);
if (o instanceof JComponent) {
JComponent c = (JComponent) o;
c.setBorder(new BottomRoundedCornerBorder());
c.setBackground(Color.WHITE);
}
}
};
// ...
class HeavyWeightContainerListener implements PopupMenuListener {
@Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
EventQueue.invokeLater(() -> {
JComboBox<?> combo = (JComboBox<?>) e.getSource();
combo.setBorder(new TopRoundedCornerBorder());
Accessible a = combo.getUI().getAccessibleChild(combo, 0);
if (a instanceof JPopupMenu) {
Window w = SwingUtilities.getWindowAncestor((Component) a);
if (w != null && w.getType() == Window.Type.POPUP) {
// Popup$HeavyWeightWindow
w.setBackground(new Color(0x0, true));
}
}
});
}
@Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
JComboBox<?> combo = (JComboBox<?>) e.getSource();
combo.setBorder(new RoundedCornerBorder());
}
@Override public void popupMenuCanceled(PopupMenuEvent e) {
/* not needed */
}
}
View in GitHub: Java, Kotlin解説
JComboBox
本体にはRoundedCornerBorder
(4
隅を丸めたラウンド矩形Border
)を設定BasicComboPopup
(ドロップダウンリスト用)にはBottomRoundedCornerBorder
(左右下の2
隅を丸めたラウンド矩形Border
)を設定PopupMenuListener
をJComboBox
に追加してドロップダウンリストが開いたとき(PopupMenuListener#popupMenuWillBecomeVisible(...)
)、JComboBox
本体にTopRoundedCornerBorder
(左右上の2
隅を丸めたラウンド矩形Border
)を設定JComboBox
本体の左辺とドロップダウンリストの左辺、JComboBox
本体の右辺とドロップダウンリストの右辺が直線でつながり、本体とドロップダウンリスト全体でひとつのRoundRectangle2D
を描画するBorder
になる
- ドロップダウンリストが閉じるとき(
PopupMenuListener#popupMenuWillBecomeInvisible(...)
)、JComboBox
本体のBorder
をRoundedCornerBorder
に戻す