LayoutManagerでコンポーネントのサイズを変更する
Total: 3617
, Today: 2
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
LayoutManager
を使用して、コンポーネントの状態に応じてそのサイズや位置を変更します。
Screenshot
Advertisement
サンプルコード
JPanel p = new JPanel(new GridBagLayout());
p.setLayout(new FlowLayout() {
@Override public void layoutContainer(Container target) {
synchronized (target.getTreeLock()) {
int nmembers = target.getComponentCount();
if (nmembers <= 0) {
return;
}
Insets insets = target.getInsets();
//int vgap = getVgap();
int hgap = getHgap();
int rowh = target.getHeight();
int x = insets.left + hgap;
for (int i = 0; i < nmembers; i++) {
Component m = target.getComponent(i);
if (m.isVisible() && m instanceof AbstractButton) {
int v = ((AbstractButton) m).isSelected() ? 80 : 50;
Dimension d = new Dimension(v, v);
m.setSize(d);
int y = (rowh - v) / 2;
m.setLocation(x, y);
x += d.width + hgap;
}
}
}
}
});
ActionListener al = e -> p.revalidate();
ButtonGroup bg = new ButtonGroup();
Stream.of("b1", "b2", "b3").forEach(s -> {
JToggleButton b = new JToggleButton(s);
b.addActionListener(al);
bg.add(b);
p.add(b);
});
View in GitHub: Java, Kotlin解説
Override JToggleButton#getPreferredSize(...)
JToggleButton#getPreferredSize(...)
をオーバーライドし、自身が選択されているかどうかで推奨サイズを変更
Override FlowLayout#layoutContainer(...)
FlowLayout#layoutContainer(...)
をオーバーライドし、子コンポーネントであるJToggleButton
が選択されているかどうかで表示サイズを変更LayoutManager
内なのでJToggleButton#setSize(...)
が使用可能LayoutManager
以外でのsetSize(...)
、setPreferredSize(...)
、setMaximumSize(...)
などの使用は非推奨- Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? - Stack Overflow
参考リンク
- Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? - Stack Overflow
- JTreeのノードを検索する
Timer
を使用してサイズ変更のアニメーションを行うBorderLayout
のサンプル