概要

LayoutManagerを使用して、コンポーネントの状態に応じてそのサイズや位置を変更します。

サンプルコード

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(...)

参考リンク

コメント