回答編集履歴
8
追記
answer
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<< 原因 >>
|
2
|
-
`scene1`
|
2
|
+
`scene1`は`JPanel`のコンストラクタで`BorderLayout`を指定していない かつ `setLayout`を呼び出していないからです。
|
3
3
|
|
4
4
|
```Java
|
5
5
|
JPanel scene1 = new JPanel(new BorderLayout()); // コンストラクタ指定 (※お勧め)
|
@@ -8,12 +8,12 @@
|
|
8
8
|
どちらかをコードに追加してくださいな。
|
9
9
|
|
10
10
|
<< 理由 >>
|
11
|
-
`scene1`のレイアウト
|
11
|
+
`scene1`のレイアウトが指定されていないため、レイアウトは`FlowLayout`になります。
|
12
|
-
> [JPanelのコンストラクタ](https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JPanel.html#JPanel--)
|
12
|
+
> [JPanelのコンストラクタ](https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JPanel.html#JPanel--) 引用部分の太文字は引用者強調
|
13
|
-
> ダブル・バッファおよびフロー・レイアウトで新しいJPanelを作成します。
|
13
|
+
> ダブル・バッファおよび**フロー・レイアウト**で新しいJPanelを作成します。
|
14
14
|
|
15
15
|
> [FlowLayoutクラス](https://www.javadrive.jp/tutorial/flowlayout/)
|
16
|
-
FlowLayoutクラスは左から順番に右に向かってコンポーネントを追加していくレイアウトマネージャーです。
|
16
|
+
FlowLayoutクラスは**左から順番に右に向かって**コンポーネントを追加していくレイアウトマネージャーです。
|
17
17
|
|
18
18
|
---
|
19
19
|
|
@@ -39,7 +39,9 @@
|
|
39
39
|
|
40
40
|
<< まとめ >>
|
41
41
|
`Swing`で`FlowLayout`以外の`Layout`を使う時は以下の2つが**必ず必要**です。
|
42
|
-
a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`
|
42
|
+
a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`Layout`を指定する。
|
43
|
+
|
44
|
+
質問コードの`CardLayout`を元に例示すると
|
43
45
|
```Java
|
44
46
|
this.panel = new JPanel();
|
45
47
|
this.layer = new CardLayout();
|
@@ -48,12 +50,13 @@
|
|
48
50
|
■参考情報
|
49
51
|
[レイアウトマネージャーの設定](https://www.javadrive.jp/tutorial/jpanel/index4.html)
|
50
52
|
|
51
|
-
b. `JPanel#add`
|
53
|
+
b. `JPanel#add`の第二引数でコンポーネントの配置位置を指定する。(例外があります※1)
|
52
54
|
```Java
|
53
55
|
this.panel.add(scene1, "menue"); // ←この行
|
54
56
|
```
|
55
57
|
|
56
|
-
※1 `Absolute Layout`
|
58
|
+
※1 `Absolute Layout`、`GridBagLayout`、etc
|
59
|
+
ここでは書ききれないので、使用したいレイアウトマネージャのドキュメントを確認してくださいな。
|
57
60
|
|
58
61
|
■参考情報
|
59
62
|
[コンポーネントの配置位置を指定する](https://www.javadrive.jp/tutorial/borderlayout/index2.html)
|
7
追記
answer
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
|
34
34
|
`layout`属性に`BorderLayout`が存在しない=`BorderLayout`を指定していない。
|
35
35
|
|
36
|
-
※`Java9`以降は`Ctrl+Shift+F1`キーは無効化されているので、`frame.
|
36
|
+
※`Java9`以降は`Ctrl+Shift+F1`キーは無効化されているので、`frame.setVisible(true);`後に`frame.list();`をソースコードに追記してくださいな。
|
37
37
|
|
38
38
|
---
|
39
39
|
|
6
追記
answer
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
|
20
20
|
<< デバック方法 >>
|
21
21
|
|
22
|
-
`Ctrl+Shift+F1`で表示される、質問文の`Swing`コンポーネントツリーは以下です。
|
22
|
+
`Ctrl+Shift+F1`で表示される、質問文の`Swing`コンポーネントツリーは以下です。(※)
|
23
23
|
```Java
|
24
24
|
javax.swing.JPanel[null.contentPane,0,0,982x653,
|
25
25
|
javax.swing.JPanel[,0,0,982x653,layout=java.awt.CardLayout,
|
@@ -33,6 +33,8 @@
|
|
33
33
|
|
34
34
|
`layout`属性に`BorderLayout`が存在しない=`BorderLayout`を指定していない。
|
35
35
|
|
36
|
+
※`Java9`以降は`Ctrl+Shift+F1`キーは無効化されているので、`frame.list(System.out);`をソースコードに追記してくださいな。
|
37
|
+
|
36
38
|
---
|
37
39
|
|
38
40
|
<< まとめ >>
|
5
typo
answer
CHANGED
@@ -1,16 +1,24 @@
|
|
1
|
+
<< 原因 >>
|
1
|
-
|
2
|
+
`scene1`に`setLayout`または`JPanel`のコンストラクタで`BorderLayout`を指定していないからです。
|
3
|
+
|
2
4
|
```Java
|
3
|
-
JPanel scene1 = new JPanel();
|
5
|
+
JPanel scene1 = new JPanel(new BorderLayout()); // コンストラクタ指定 (※お勧め)
|
4
|
-
scene1.setLayout(new BorderLayout());
|
6
|
+
scene1.setLayout(new BorderLayout()); // またはsetLayout指定
|
5
7
|
```
|
8
|
+
どちらかをコードに追加してくださいな。
|
6
9
|
|
10
|
+
<< 理由 >>
|
7
|
-
|
11
|
+
`scene1`のレイアウトを指定していないので、デフォルトレイアウトの`FlowLayout`になります。
|
8
12
|
> [JPanelのコンストラクタ](https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JPanel.html#JPanel--)
|
9
13
|
> ダブル・バッファおよびフロー・レイアウトで新しいJPanelを作成します。
|
10
14
|
|
11
15
|
> [FlowLayoutクラス](https://www.javadrive.jp/tutorial/flowlayout/)
|
12
16
|
FlowLayoutクラスは左から順番に右に向かってコンポーネントを追加していくレイアウトマネージャーです。
|
13
17
|
|
18
|
+
---
|
19
|
+
|
20
|
+
<< デバック方法 >>
|
21
|
+
|
14
22
|
`Ctrl+Shift+F1`で表示される、質問文の`Swing`コンポーネントツリーは以下です。
|
15
23
|
```Java
|
16
24
|
javax.swing.JPanel[null.contentPane,0,0,982x653,
|
@@ -27,7 +35,8 @@
|
|
27
35
|
|
28
36
|
---
|
29
37
|
|
38
|
+
<< まとめ >>
|
30
|
-
|
39
|
+
`Swing`で`FlowLayout`以外の`Layout`を使う時は以下の2つが**必ず必要**です。
|
31
40
|
a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`FlowLayout`以外という旨を`Swing`に通知する。
|
32
41
|
```Java
|
33
42
|
this.panel = new JPanel();
|
4
追記
answer
CHANGED
@@ -5,7 +5,12 @@
|
|
5
5
|
```
|
6
6
|
|
7
7
|
前回とほぼ一緒で、`scene1`のレイアウトを指定していないので、規定レイアウトの`FlowLayout`になるという点。
|
8
|
+
> [JPanelのコンストラクタ](https://docs.oracle.com/javase/jp/9/docs/api/javax/swing/JPanel.html#JPanel--)
|
9
|
+
> ダブル・バッファおよびフロー・レイアウトで新しいJPanelを作成します。
|
8
10
|
|
11
|
+
> [FlowLayoutクラス](https://www.javadrive.jp/tutorial/flowlayout/)
|
12
|
+
FlowLayoutクラスは左から順番に右に向かってコンポーネントを追加していくレイアウトマネージャーです。
|
13
|
+
|
9
14
|
`Ctrl+Shift+F1`で表示される、質問文の`Swing`コンポーネントツリーは以下です。
|
10
15
|
```Java
|
11
16
|
javax.swing.JPanel[null.contentPane,0,0,982x653,
|
@@ -22,8 +27,8 @@
|
|
22
27
|
|
23
28
|
---
|
24
29
|
|
25
|
-
纏めると`Swing`で`FlowLayout`
|
30
|
+
纏めると`Swing`で`FlowLayout`以外のLayoutを使う時は以下の2つが**必ず必要**です。
|
26
|
-
a. `JPanel#setLayout`で`FlowLayout`以外
|
31
|
+
a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`FlowLayout`以外という旨を`Swing`に通知する。
|
27
32
|
```Java
|
28
33
|
this.panel = new JPanel();
|
29
34
|
this.layer = new CardLayout();
|
@@ -32,11 +37,13 @@
|
|
32
37
|
■参考情報
|
33
38
|
[レイアウトマネージャーの設定](https://www.javadrive.jp/tutorial/jpanel/index4.html)
|
34
39
|
|
35
|
-
b. `JPanel#add`時の第二引数でコンポーネントの配置位置を指定する。
|
40
|
+
b. `JPanel#add`時の第二引数でコンポーネントの配置位置を指定する。(※1)
|
36
41
|
```Java
|
37
42
|
this.panel.add(scene1, "menue"); // ←この行
|
38
43
|
```
|
39
44
|
|
45
|
+
※1 `Absolute Layout`の場合は、コンポーネント(`JLabel`)側で位置を指定します。
|
46
|
+
|
40
47
|
■参考情報
|
41
48
|
[コンポーネントの配置位置を指定する](https://www.javadrive.jp/tutorial/borderlayout/index2.html)
|
42
49
|
|
3
嫌味ぽくなってるので、削除。
answer
CHANGED
@@ -5,9 +5,8 @@
|
|
5
5
|
```
|
6
6
|
|
7
7
|
前回とほぼ一緒で、`scene1`のレイアウトを指定していないので、規定レイアウトの`FlowLayout`になるという点。
|
8
|
-
うーん、[前回、デバックの仕方](https://teratail.com/questions/141158)について回答しましたが、分かりづらかったですか?
|
9
8
|
|
10
|
-
`Ctrl+Shift+F1`で表示される、質問文のコンポーネントツリーは以下です。
|
9
|
+
`Ctrl+Shift+F1`で表示される、質問文の`Swing`コンポーネントツリーは以下です。
|
11
10
|
```Java
|
12
11
|
javax.swing.JPanel[null.contentPane,0,0,982x653,
|
13
12
|
javax.swing.JPanel[,0,0,982x653,layout=java.awt.CardLayout,
|
@@ -21,18 +20,23 @@
|
|
21
20
|
|
22
21
|
`layout`属性に`BorderLayout`が存在しない=`BorderLayout`を指定していない。
|
23
22
|
|
23
|
+
---
|
24
|
+
|
25
|
+
纏めると`Swing`で`FlowLayout`と`Absolute Layout`以外を使う時は以下の2つが**必ず必要**です。
|
24
|
-
a. `
|
26
|
+
a. `JPanel#setLayout`で`FlowLayout`以外の`Layout`という旨を`Swing`に通知する。
|
25
27
|
```Java
|
26
28
|
this.panel = new JPanel();
|
27
29
|
this.layer = new CardLayout();
|
28
30
|
this.panel.setLayout(this.layer); // ←この行
|
29
31
|
```
|
32
|
+
■参考情報
|
33
|
+
[レイアウトマネージャーの設定](https://www.javadrive.jp/tutorial/jpanel/index4.html)
|
34
|
+
|
30
|
-
b. `JPanel#add`時の第二引数で
|
35
|
+
b. `JPanel#add`時の第二引数でコンポーネントの配置位置を指定する。
|
31
36
|
```Java
|
32
37
|
this.panel.add(scene1, "menue"); // ←この行
|
33
38
|
```
|
34
39
|
|
35
|
-
この2つが必要で、質問文のコードは`setLayout`が無いです。
|
36
40
|
■参考情報
|
37
41
|
[コンポーネントの配置位置を指定する](https://www.javadrive.jp/tutorial/borderlayout/index2.html)
|
38
42
|
|
2
追記
answer
CHANGED
@@ -21,13 +21,13 @@
|
|
21
21
|
|
22
22
|
`layout`属性に`BorderLayout`が存在しない=`BorderLayout`を指定していない。
|
23
23
|
|
24
|
-
|
24
|
+
a. `Swing`の画面は`setLayout`で全体(`JPanel`)のレイアウトを指定。
|
25
25
|
```Java
|
26
26
|
this.panel = new JPanel();
|
27
27
|
this.layer = new CardLayout();
|
28
28
|
this.panel.setLayout(this.layer); // ←この行
|
29
29
|
```
|
30
|
-
|
30
|
+
b. `JPanel#add`時の第二引数でどこに配置するのかを指定。
|
31
31
|
```Java
|
32
32
|
this.panel.add(scene1, "menue"); // ←この行
|
33
33
|
```
|
1
追記
answer
CHANGED
@@ -7,8 +7,8 @@
|
|
7
7
|
前回とほぼ一緒で、`scene1`のレイアウトを指定していないので、規定レイアウトの`FlowLayout`になるという点。
|
8
8
|
うーん、[前回、デバックの仕方](https://teratail.com/questions/141158)について回答しましたが、分かりづらかったですか?
|
9
9
|
|
10
|
-
Ctrl+Shift+F1で表示される、質問文のコンポーネントツリーは以下です。
|
10
|
+
`Ctrl+Shift+F1`で表示される、質問文のコンポーネントツリーは以下です。
|
11
|
-
```
|
11
|
+
```Java
|
12
12
|
javax.swing.JPanel[null.contentPane,0,0,982x653,
|
13
13
|
javax.swing.JPanel[,0,0,982x653,layout=java.awt.CardLayout,
|
14
14
|
javax.swing.JPanel[,0,0,982x653,layout=java.awt.FlowLayout,
|
@@ -21,7 +21,21 @@
|
|
21
21
|
|
22
22
|
`layout`属性に`BorderLayout`が存在しない=`BorderLayout`を指定していない。
|
23
23
|
|
24
|
+
0. `Swing`の画面は`setLayout`で全体(`JPanel`)のレイアウトを指定。
|
25
|
+
```Java
|
26
|
+
this.panel = new JPanel();
|
27
|
+
this.layer = new CardLayout();
|
28
|
+
this.panel.setLayout(this.layer); // ←この行
|
29
|
+
```
|
30
|
+
0. `add`時の第二引数で`JPanel`のどこに配置するのかを指定。
|
31
|
+
```Java
|
32
|
+
this.panel.add(scene1, "menue"); // ←この行
|
33
|
+
```
|
34
|
+
|
35
|
+
この2つが必要で、質問文のコードは`setLayout`が無いです。
|
36
|
+
■参考情報
|
37
|
+
[コンポーネントの配置位置を指定する](https://www.javadrive.jp/tutorial/borderlayout/index2.html)
|
38
|
+
|
24
39
|
---
|
25
40
|
|
26
|
-
あと`Swing`で画面レイアウトを作成する時は、`WindowBuilder`を使ってくださいな。
|
27
|
-
|
41
|
+
あと`Swing`で画面レイアウトを作成する時は、[WindowBuilder](https://teratail.com/questions/129500)を使ってくださいな。
|