回答編集履歴

1

コード追加

2022/06/23 05:56

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -6,3 +6,105 @@
6
6
  コンボボックスのように位置・大きさを指定して画面を構成するのでしたら label1 も同様にする、逆に label1 のようにレイアウトマネージャを使うのであればコンボボックスもそのようにするということです。
7
7
 
8
8
  ちなみに、BorderLayout を使っている時に add() メソッドの第二パラメータを省略すると borderLayout.CENTER の指定と見なされますので、ご注意ください。
9
+
10
+ ---
11
+ シミュレータということで武器のパラメータが増えると見込んで武器をクラスにしました。
12
+ コンボボックスの配置は Panel の FlowLayout に任せていますので(横に並んでしまっていますが)、フレームの大きさを変えても自動で常に中央に移動します。
13
+ ```java
14
+ import java.awt.*;
15
+ import java.util.*;
16
+ import java.util.List;
17
+
18
+ import javax.swing.*;
19
+
20
+ /** 武器 */
21
+ class Weapon {
22
+ /** 種別 */
23
+ enum Type {
24
+ SWORD("剣"), CANE("杖"), BOW("弓");
25
+
26
+ final String text;
27
+ Type(String text) {
28
+ this.text = text;
29
+ }
30
+ @Override
31
+ public String toString() {
32
+ return text;
33
+ }
34
+ }
35
+
36
+ final String name;
37
+ final Type type;
38
+ Weapon(String name, Type type) {
39
+ this.name = name;
40
+ this.type = type;
41
+ }
42
+ @Override
43
+ public String toString() {
44
+ return name;
45
+ }
46
+ }
47
+
48
+ //JFrameクラスを継承したしたクラスを定義
49
+ public class JSample1_2 extends JFrame {
50
+ private static final String TITLE = "鍛冶職人シミュレーター";
51
+
52
+ private static final Map<Weapon.Type,List<Weapon>> weaponsTypeMap = new HashMap<Weapon.Type,List<Weapon>>();
53
+ static {
54
+ //武器が多数になるなら、ファイルから読み込むようにする等を視野に
55
+ putWeaponsMap(new Weapon("はやぶさの剣", Weapon.Type.SWORD));
56
+ putWeaponsMap(new Weapon("名刀:斬鉄丸", Weapon.Type.SWORD));
57
+ putWeaponsMap(new Weapon("スーパーのナス", Weapon.Type.SWORD));
58
+
59
+ putWeaponsMap(new Weapon("いかずちの杖", Weapon.Type.CANE));
60
+ putWeaponsMap(new Weapon("イーリスの杖", Weapon.Type.CANE));
61
+ putWeaponsMap(new Weapon("スーパーのニンジン", Weapon.Type.CANE));
62
+
63
+ putWeaponsMap(new Weapon("月光の弓", Weapon.Type.BOW));
64
+ putWeaponsMap(new Weapon("魔弓サジタリウス", Weapon.Type.BOW));
65
+ putWeaponsMap(new Weapon("スーパーのスイカ", Weapon.Type.BOW));
66
+ }
67
+ private static void putWeaponsMap(Weapon weapon) {
68
+ List<Weapon> weapons = weaponsTypeMap.get(weapon.type);
69
+ if(weapons == null) {
70
+ weapons = new ArrayList<>();
71
+ weaponsTypeMap.put(weapon.type, weapons);
72
+ }
73
+ weapons.add(weapon);
74
+ }
75
+
76
+ public static void main(String args[]){
77
+ SwingUtilities.invokeLater(() -> new JSample1_2().setVisible(true)); //JFrame作成・表示
78
+ }
79
+
80
+ JSample1_2() {
81
+ setTitle(TITLE);
82
+ setBounds(100, 100, 600, 400);
83
+ setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
84
+
85
+ JLabel titleLabel = new JLabel(TITLE);
86
+ titleLabel.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 50));
87
+ add(titleLabel, BorderLayout.NORTH); //getContentPane() は省略可能
88
+
89
+ JPanel contentsPanel = new JPanel(); //デフォルトは FlowLayout
90
+
91
+ JComboBox<Weapon.Type> typeComboBox = new JComboBox<>();
92
+ typeComboBox.setPreferredSize(new Dimension(170, 50));
93
+ typeComboBox.setModel(new DefaultComboBoxModel<Weapon.Type>(Weapon.Type.values()));
94
+ contentsPanel.add(typeComboBox);
95
+
96
+ JComboBox<Weapon> weaponComboBox = new JComboBox<>();
97
+ weaponComboBox.setPreferredSize(new Dimension(170, 50));
98
+ contentsPanel.add(weaponComboBox);
99
+
100
+ add(contentsPanel, BorderLayout.CENTER);
101
+
102
+ typeComboBox.addActionListener(evt -> {
103
+ List<Weapon> weapons = weaponsTypeMap.get((Weapon.Type)typeComboBox.getSelectedItem());
104
+ weaponComboBox.setModel(new DefaultComboBoxModel<Weapon>(weapons.toArray(new Weapon[weapons.size()])));
105
+ });
106
+
107
+ typeComboBox.setSelectedIndex(0); //初期選択(リスナが動いて weaponComboBox にモデルが設定される)
108
+ }
109
+ }
110
+ ```