Swing/VariableRoundedBorderOnComboBox のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/VariableRoundedBorderOnComboBox へ行く。
- 1 (2024-03-11 (月) 02:52:09)
- category: swing folder: VariableRoundedBorderOnComboBox title: JComboBoxのBorderをドロップダウンリストの表示状態で切り替える tags: [JComboBox, Border, PopupMenuListener] author: aterai pubdate: 2024-03-11T02:49:30+09:00 description: JComboBoxのBorderをドロップダウンリストの表示状態で切り替えて左右の辺が直線で描画されるよう設定します。 image: https://drive.google.com/uc?id=1srDCMSHQw2olzIC8t0q1MQjJRHhVR4y_
概要
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
に戻す