• category: swing folder: EnumInputSelect title: Enum定数を選択するJRadioButtonのButtonGroupやJComboBoxを作成する tags: [JRadioButton, JRadioButtonMenuItem, JComboBox, JSpinner] author: aterai pubdate: 2023-05-01T04:13:48+09:00 description: Enum定数の一覧からJRadioButtonのButtonGroupやJComboBox、JSpinnerなどの選択コンポーネントを作成し、指定したenum定数を取得します。 image: https://drive.google.com/uc?id=1rClNFi7Ho6S142h4FccGE2d0RYNZyKhA

概要

Enum定数の一覧からJRadioButtonButtonGroupJComboBoxJSpinnerなどの選択コンポーネントを作成し、指定したenum定数を取得します。

サンプルコード

enum TabPlacement {
  TOP(SwingConstants.TOP),
  LEFT(SwingConstants.LEFT),
  BOTTOM(SwingConstants.BOTTOM),
  RIGHT(SwingConstants.RIGHT);

  private final int placement;

  TabPlacement(int placement) {
    this.placement = placement;
  }

  public int getPlacement() {
    return placement;
  }
}

// ...
JTabbedPane tabs3 = makeTabbedPane();
JComboBox<TabPlacement> combo = new JComboBox<>(TabPlacement.values());
combo.addItemListener(e -> {
  Object o = e.getItem();
  if (e.getStateChange() == ItemEvent.SELECTED && o instanceof TabPlacement) {
    tabs3.setTabPlacement(((TabPlacement) o).getPlacement());
  }
});
View in GitHub: Java, Kotlin

解説

  • JTabbedPaneのタブ配置を設定する定数を置き換えるEnum列挙型のTabPlacementを作成
    • TabPlacement.values()で定数一覧を取得し以下のような選択コンポーネントを作成
    • これらの選択コンポーネントで指定されたenum定数から取得した元のint定数をJTabbedPane#setTabPlacement(int)に適用してJTabbedPaneのタブ配置を変更可能

  • JRadioButtonMenuItemJRadioButton
    • enum定数の名前をボタンのアクションコマンドに設定し、ItemListenerで選択されたボタンのアクションコマンドを取得してTabPlacement.valueOf(...)で対応するenum定数を取得
      JTabbedPane tabs1 = makeTabbedPane();
      JMenu menu = new JMenu("JMenu");
      ButtonGroup bg1 = new ButtonGroup();
      ItemListener handler1 = e -> {
        if (e.getStateChange() == ItemEvent.SELECTED) {
          String name = bg1.getSelection().getActionCommand();
          tabs1.setTabPlacement(TabPlacement.valueOf(name).getPlacement());
        }
      };
      Arrays.asList(TabPlacement.values()).forEach(tp -> {
        String name = tp.name();
        boolean selected = tp == TabPlacement.TOP;
        JMenuItem item = new JRadioButtonMenuItem(name, selected);
        item.addItemListener(handler1);
        item.setActionCommand(name);
        menu.add(item);
        bg1.add(item);
      });
      
  • JComboBox<TabPlacement>
    • TabPlacement.values()で取得した定数配列からComboBoxModel<TabPlacement>を作成してJComboBox<TabPlacement>を作成
    • JComboBox<TabPlacement>ItemListenerを設定し、ItemEvent#getItem()enum定数を取得
    • JRadioButtonのサンプルと同様にenum定数の名前をItemEvent#getItem()#toString()で取得し、TabPlacement.valueOf(...)で対応するenum定数を取得する方法もある
    • 選択インデックスからJComboBox<TabPlacement>#getItemAt(idx)で直接enum定数を取得する方法もある
      JComboBox<TabPlacement> combo = new JComboBox<>(TabPlacement.values());
      combo.addItemListener(e -> {
        if (e.getStateChange() == ItemEvent.SELECTED) {
          // String n = e.getItem().toString();
          // tabs3.setTabPlacement(TabPlacement.valueOf(n).getPlacement());
          int idx = combo.getSelectedIndex();
          tabs3.setTabPlacement(combo.getItemAt(idx).getPlacement());
        }
      });
      
  • JSpinner
    • TabPlacement.values()で取得した定数配列からSpinnerListModelを作成してJSpinnerを作成
    • JSpinnerChangeListenerを設定し、SpinnerListModel#getValue()enum定数を取得
      JTabbedPane tabs4 = makeTabbedPane();
      SpinnerListModel model4 = new SpinnerListModel(TabPlacement.values());
      JSpinner spinner = new JSpinner(model4) {
        @Override public Object getNextValue() {
          return super.getPreviousValue();
        }
      
        @Override public Object getPreviousValue() {
          return super.getNextValue();
        }
      };
      spinner.addChangeListener(e -> {
        Object o = model4.getValue();
        if (o instanceof TabPlacement) {
          tabs4.setTabPlacement(((TabPlacement) o).getPlacement());
        }
      });
      

参考リンク

コメント