JToolBarがドラッグ・アウト状態になった場合、そのLayoutManagerを変更する
Total: 2112
, Today: 2
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JToolBar
がドラッグ・アウト状態になった場合、そのLayoutManager
をデフォルトのBoxLayout
からGridLayout
に変更します。
Screenshot
Advertisement
サンプルコード
JToolBar toolbar = new JToolBar(SwingConstants.VERTICAL);
// toolbar.setLayout(new BoxLayout(toolbar, BoxLayout.PAGE_AXIS));
// TEST:
// JToolBar toolbar = new JToolBar(orientation) {
// @Override public Dimension getPreferredSize() {
// if (((BasicToolBarUI) getUI()).isFloating()) {
// setLayout(new GridLayout(0, 3));
// return new Dimension(ICON_SIZE * 3, ICON_SIZE * 2);
// } else {
// setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
// return super.getPreferredSize();
// }
// }
//
// @Override public Dimension getMinimumSize() {
// return getPreferredSize();
// }
//
// @Override public Dimension getMaximumSize() {
// return getPreferredSize();
// }
// };
JPanel panel = new JPanel() {
@Override public Dimension getPreferredSize() {
if (((BasicToolBarUI) toolbar.getUI()).isFloating()) {
setLayout(new GridLayout(0, 3));
return new Dimension(ICON_SIZE * 3, ICON_SIZE * 2);
} else {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
return super.getPreferredSize();
}
}
@Override public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override public Dimension getMaximumSize() {
return getPreferredSize();
}
};
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new ColorPanel(Color.RED));
panel.add(new ColorPanel(Color.GREEN));
panel.add(new ColorPanel(Color.BLUE));
panel.add(new ColorPanel(Color.ORANGE));
panel.add(new ColorPanel(Color.CYAN));
toolbar.add(panel);
toolbar.add(Box.createGlue());
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JToolBar
が親のJFrame
に格納されている場合は縦BoxLayout
、ドラッグ・アウトされてfloating
状態の場合は3
列GridLayout
になるよう設定しています。
- このサンプルの
JToolBar
は親JFrame
の左右にのみドッキング可能に制限 JToolBar
がドラッグ・アウトされているかどうかはBasicToolBarUI#isFloating()
メソッドで判断getPreferredSize()
メソッドが実行されたときに推奨サイズの変更と合わせてLayoutManager
の切り替えを行うAncestorListener#ancestorAdded(...)
が実行されたときにLayoutManager
の切り替えを行う方法もあるが、ドラッグ・アウト継続中にJToolBar
の縦横が変化する場合に対応できないJToolBar#getPreferredSize()
をオーバーライドした場合、ドラッグ・アウトされたJToolBar
のサイズがJToolBar
の親JDialog
まで拡大されてしまうJToolBar
の親JDialog
のサイズは固定?で変更できないので、JToolBar
の子にJPanel
を挟んでこのJPanel#getPreferredSize()
メソッドをオーバーライドし、LayoutManager
を切り替えることで回避(ドラッグ・アウトされたJToolBar
の左右に余白を設ける)