回答編集履歴

8

追記

2018/08/14 20:00

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,6 +1,6 @@
1
1
  << 原因 >>
2
2
 
3
- `scene1`に`setLayout`または`JPanel`のコンストラクタで`BorderLayout`を指定していないからです。
3
+ `scene1`は`JPanel`のコンストラクタで`BorderLayout`を指定していない つ `setLayout`を呼び出していないからです。
4
4
 
5
5
 
6
6
 
@@ -18,17 +18,17 @@
18
18
 
19
19
  << 理由 >>
20
20
 
21
- `scene1`のレイアウト指定ていないのでデフォルトレイアウト`FlowLayout`になります。
21
+ `scene1`のレイアウト指定されていないため、レイアウト`FlowLayout`になります。
22
22
 
23
- > [JPanelのコンストラクタ](https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JPanel.html#JPanel--)
23
+ > [JPanelのコンストラクタ](https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JPanel.html#JPanel--) 引用部分の太文字は引用者強調
24
24
 
25
- > ダブル・バッファおよびフロー・レイアウトで新しいJPanelを作成します。
25
+ > ダブル・バッファおよび**フロー・レイアウト**で新しいJPanelを作成します。
26
26
 
27
27
 
28
28
 
29
29
  > [FlowLayoutクラス](https://www.javadrive.jp/tutorial/flowlayout/)
30
30
 
31
- FlowLayoutクラスは左から順番に右に向かってコンポーネントを追加していくレイアウトマネージャーです。
31
+ FlowLayoutクラスは**左から順番に右に向かって**コンポーネントを追加していくレイアウトマネージャーです。
32
32
 
33
33
 
34
34
 
@@ -80,7 +80,11 @@
80
80
 
81
81
  `Swing`で`FlowLayout`以外の`Layout`を使う時は以下の2つが**必ず必要**です。
82
82
 
83
- a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`FlowLayout`以外という旨`Swing`に通知する。
83
+ a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`Layout`を指定する。
84
+
85
+
86
+
87
+ 質問コードの`CardLayout`を元に例示すると
84
88
 
85
89
  ```Java
86
90
 
@@ -98,7 +102,7 @@
98
102
 
99
103
 
100
104
 
101
- b. `JPanel#add`の第二引数でコンポーネントの配置位置を指定する。(※1)
105
+ b. `JPanel#add`の第二引数でコンポーネントの配置位置を指定する。(例外があります※1)
102
106
 
103
107
  ```Java
104
108
 
@@ -108,7 +112,9 @@
108
112
 
109
113
 
110
114
 
111
- ※1 `Absolute Layout`の場合はコンポーネント(`JLabel`)側で位置を指定します。
115
+ ※1 `Absolute Layout`、`GridBagLayout`、etc
116
+
117
+ ここでは書ききれないので、使用したいレイアウトマネージャのドキュメントを確認してくださいな。
112
118
 
113
119
 
114
120
 

7

追記

2018/08/14 20:00

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -68,7 +68,7 @@
68
68
 
69
69
 
70
70
 
71
- ※`Java9`以降は`Ctrl+Shift+F1`キーは無効化されているので、`frame.list(System.out);`をソースコードに追記してくださいな。
71
+ ※`Java9`以降は`Ctrl+Shift+F1`キーは無効化されているので、`frame.setVisible(true);`後に`frame.list();`をソースコードに追記してくださいな。
72
72
 
73
73
 
74
74
 

6

追記

2018/08/14 19:48

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- `Ctrl+Shift+F1`で表示される、質問文の`Swing`コンポーネントツリーは以下です。
43
+ `Ctrl+Shift+F1`で表示される、質問文の`Swing`コンポーネントツリーは以下です。(※)
44
44
 
45
45
  ```Java
46
46
 
@@ -65,6 +65,10 @@
65
65
 
66
66
 
67
67
  `layout`属性に`BorderLayout`が存在しない=`BorderLayout`を指定していない。
68
+
69
+
70
+
71
+ ※`Java9`以降は`Ctrl+Shift+F1`キーは無効化されているので、`frame.list(System.out);`をソースコードに追記してくださいな。
68
72
 
69
73
 
70
74
 

5

typo

2018/08/14 18:18

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,16 +1,24 @@
1
+ << 原因 >>
2
+
1
- 原因は`scene1`に`setLayout`で`BorderLayout`を指定していないからです。
3
+ `scene1`に`setLayout`または`JPanel`のコンストラクタで`BorderLayout`を指定していないからです。
4
+
5
+
2
6
 
3
7
  ```Java
4
8
 
5
- JPanel scene1 = new JPanel();
9
+ JPanel scene1 = new JPanel(new BorderLayout()); // コンストラクタ指定 (※お勧め)
6
10
 
7
- scene1.setLayout(new BorderLayout());
11
+ scene1.setLayout(new BorderLayout()); // またはsetLayout指定
8
12
 
9
13
  ```
10
14
 
15
+ どちらかをコードに追加してくださいな。
11
16
 
12
17
 
18
+
19
+ << 理由 >>
20
+
13
- 前回とほぼ一緒で、`scene1`のレイアウトを指定していないので、規定レイアウトの`FlowLayout`になるという点
21
+ `scene1`のレイアウトを指定していないので、デフォルトレイアウトの`FlowLayout`になります
14
22
 
15
23
  > [JPanelのコンストラクタ](https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JPanel.html#JPanel--)
16
24
 
@@ -21,6 +29,14 @@
21
29
  > [FlowLayoutクラス](https://www.javadrive.jp/tutorial/flowlayout/)
22
30
 
23
31
  FlowLayoutクラスは左から順番に右に向かってコンポーネントを追加していくレイアウトマネージャーです。
32
+
33
+
34
+
35
+ ---
36
+
37
+
38
+
39
+ << デバック方法 >>
24
40
 
25
41
 
26
42
 
@@ -56,7 +72,9 @@
56
72
 
57
73
 
58
74
 
75
+ << まとめ >>
76
+
59
- 纏めると`Swing`で`FlowLayout`以外のLayoutを使う時は以下の2つが**必ず必要**です。
77
+ `Swing`で`FlowLayout`以外の`Layout`を使う時は以下の2つが**必ず必要**です。
60
78
 
61
79
  a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`FlowLayout`以外という旨を`Swing`に通知する。
62
80
 

4

追記

2018/08/14 16:20

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -11,6 +11,16 @@
11
11
 
12
12
 
13
13
  前回とほぼ一緒で、`scene1`のレイアウトを指定していないので、規定レイアウトの`FlowLayout`になるという点。
14
+
15
+ > [JPanelのコンストラクタ](https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JPanel.html#JPanel--)
16
+
17
+ > ダブル・バッファおよびフロー・レイアウトで新しいJPanelを作成します。
18
+
19
+
20
+
21
+ > [FlowLayoutクラス](https://www.javadrive.jp/tutorial/flowlayout/)
22
+
23
+ FlowLayoutクラスは左から順番に右に向かってコンポーネントを追加していくレイアウトマネージャーです。
14
24
 
15
25
 
16
26
 
@@ -46,9 +56,9 @@
46
56
 
47
57
 
48
58
 
49
- 纏めると`Swing`で`FlowLayout`と`Absolute Layout`以外を使う時は以下の2つが**必ず必要**です。
59
+ 纏めると`Swing`で`FlowLayout`以外のLayoutを使う時は以下の2つが**必ず必要**です。
50
60
 
51
- a. `JPanel#setLayout`で`FlowLayout`以外の`Layout`という旨を`Swing`に通知する。
61
+ a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`FlowLayout`以外という旨を`Swing`に通知する。
52
62
 
53
63
  ```Java
54
64
 
@@ -66,13 +76,17 @@
66
76
 
67
77
 
68
78
 
69
- b. `JPanel#add`時の第二引数でコンポーネントの配置位置を指定する。
79
+ b. `JPanel#add`時の第二引数でコンポーネントの配置位置を指定する。(※1)
70
80
 
71
81
  ```Java
72
82
 
73
83
  this.panel.add(scene1, "menue"); // ←この行
74
84
 
75
85
  ```
86
+
87
+
88
+
89
+ ※1 `Absolute Layout`の場合は、コンポーネント(`JLabel`)側で位置を指定します。
76
90
 
77
91
 
78
92
 

3

嫌味ぽくなってるので、削除。

2018/08/14 16:11

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -12,11 +12,9 @@
12
12
 
13
13
  前回とほぼ一緒で、`scene1`のレイアウトを指定していないので、規定レイアウトの`FlowLayout`になるという点。
14
14
 
15
- うーん、[前回、デバックの仕方](https://teratail.com/questions/141158)について回答しましたが、分かりづらかったですか?
16
15
 
17
16
 
18
-
19
- `Ctrl+Shift+F1`で表示される、質問文のコンポーネントツリーは以下です。
17
+ `Ctrl+Shift+F1`で表示される、質問文の`Swing`コンポーネントツリーは以下です。
20
18
 
21
19
  ```Java
22
20
 
@@ -44,7 +42,13 @@
44
42
 
45
43
 
46
44
 
45
+ ---
46
+
47
+
48
+
49
+ 纏めると`Swing`で`FlowLayout`と`Absolute Layout`以外を使う時は以下の2つが**必ず必要**です。
50
+
47
- a. `Swing`の画面は`setLayout`で全体(`JPanel`)レイアウト指定
51
+ a. `JPanel#setLayout`で`FlowLayout`以外`Layout`という旨`Swing`に通知する
48
52
 
49
53
  ```Java
50
54
 
@@ -56,7 +60,13 @@
56
60
 
57
61
  ```
58
62
 
63
+ ■参考情報
64
+
65
+ [レイアウトマネージャーの設定](https://www.javadrive.jp/tutorial/jpanel/index4.html)
66
+
67
+
68
+
59
- b. `JPanel#add`時の第二引数でどこに配置するのかを指定。
69
+ b. `JPanel#add`時の第二引数でコンポーネントの配置位置を指定する
60
70
 
61
71
  ```Java
62
72
 
@@ -65,8 +75,6 @@
65
75
  ```
66
76
 
67
77
 
68
-
69
- この2つが必要で、質問文のコードは`setLayout`が無いです。
70
78
 
71
79
  ■参考情報
72
80
 

2

追記

2018/08/14 16:03

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
 
46
46
 
47
- 0. `Swing`の画面は`setLayout`で全体(`JPanel`)のレイアウトを指定。
47
+ a. `Swing`の画面は`setLayout`で全体(`JPanel`)のレイアウトを指定。
48
48
 
49
49
  ```Java
50
50
 
@@ -56,7 +56,7 @@
56
56
 
57
57
  ```
58
58
 
59
- 0. `add`時の第二引数で`JPanel`のどこに配置するのかを指定。
59
+ b. `JPanel#add`時の第二引数でどこに配置するのかを指定。
60
60
 
61
61
  ```Java
62
62
 

1

追記

2018/08/14 15:54

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -16,9 +16,9 @@
16
16
 
17
17
 
18
18
 
19
- Ctrl+Shift+F1で表示される、質問文のコンポーネントツリーは以下です。
19
+ `Ctrl+Shift+F1`で表示される、質問文のコンポーネントツリーは以下です。
20
20
 
21
- ```
21
+ ```Java
22
22
 
23
23
  javax.swing.JPanel[null.contentPane,0,0,982x653,
24
24
 
@@ -44,10 +44,38 @@
44
44
 
45
45
 
46
46
 
47
+ 0. `Swing`の画面は`setLayout`で全体(`JPanel`)のレイアウトを指定。
48
+
49
+ ```Java
50
+
51
+ this.panel = new JPanel();
52
+
53
+ this.layer = new CardLayout();
54
+
55
+ this.panel.setLayout(this.layer); // ←この行
56
+
57
+ ```
58
+
59
+ 0. `add`時の第二引数で`JPanel`のどこに配置するのかを指定。
60
+
61
+ ```Java
62
+
63
+ this.panel.add(scene1, "menue"); // ←この行
64
+
65
+ ```
66
+
67
+
68
+
69
+ この2つが必要で、質問文のコードは`setLayout`が無いです。
70
+
71
+ ■参考情報
72
+
73
+ [コンポーネントの配置位置を指定する](https://www.javadrive.jp/tutorial/borderlayout/index2.html)
74
+
75
+
76
+
47
77
  ---
48
78
 
49
79
 
50
80
 
51
- あと`Swing`で画面レイアウトを作成する時は、`WindowBuilder`を使ってくださいな。
52
-
53
- [2ヶ月前にその旨、回答した記憶がるのですが……](https://teratail.com/questions/129500)
81
+ と`Swing`画面レイアウトを作成る時は、[WindowBuilder](https://teratail.com/questions/129500)を使ってくださいな。