質問するログイン新規登録

回答編集履歴

8

追記

2018/08/14 20:00

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  << 原因 >>
2
- `scene1`に`setLayout`または`JPanel`のコンストラクタで`BorderLayout`を指定していないからです。
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`のレイアウト指定ていないのでデフォルトレイアウト`FlowLayout`になります。
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`で`FlowLayout`以外という旨`Swing`に通知する。
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`の第二引数でコンポーネントの配置位置を指定する。(※1)
53
+ b. `JPanel#add`の第二引数でコンポーネントの配置位置を指定する。(例外があります※1)
52
54
  ```Java
53
55
  this.panel.add(scene1, "menue"); // ←この行
54
56
  ```
55
57
 
56
- ※1 `Absolute Layout`の場合はコンポーネント(`JLabel`)側で位置を指定します。
58
+ ※1 `Absolute Layout`、`GridBagLayout`、etc
59
+ ここでは書ききれないので、使用したいレイアウトマネージャのドキュメントを確認してくださいな。
57
60
 
58
61
  ■参考情報
59
62
  [コンポーネントの配置位置を指定する](https://www.javadrive.jp/tutorial/borderlayout/index2.html)

7

追記

2018/08/14 20:00

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -33,7 +33,7 @@
33
33
 
34
34
  `layout`属性に`BorderLayout`が存在しない=`BorderLayout`を指定していない。
35
35
 
36
- ※`Java9`以降は`Ctrl+Shift+F1`キーは無効化されているので、`frame.list(System.out);`をソースコードに追記してくださいな。
36
+ ※`Java9`以降は`Ctrl+Shift+F1`キーは無効化されているので、`frame.setVisible(true);`後に`frame.list();`をソースコードに追記してくださいな。
37
37
 
38
38
  ---
39
39
 

6

追記

2018/08/14 19:48

投稿

umyu
umyu

スコア5846

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

2018/08/14 18:18

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,16 +1,24 @@
1
+ << 原因 >>
1
- 原因は`scene1`に`setLayout`で`BorderLayout`を指定していないからです。
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
- 前回とほぼ一緒で、`scene1`のレイアウトを指定していないので、規定レイアウトの`FlowLayout`になるという点
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
- 纏めると`Swing`で`FlowLayout`以外のLayoutを使う時は以下の2つが**必ず必要**です。
39
+ `Swing`で`FlowLayout`以外の`Layout`を使う時は以下の2つが**必ず必要**です。
31
40
  a. `JPanel`のコンストラクタまたは`JPanel#setLayout`で`FlowLayout`以外という旨を`Swing`に通知する。
32
41
  ```Java
33
42
  this.panel = new JPanel();

4

追記

2018/08/14 16:20

投稿

umyu
umyu

スコア5846

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`と`Absolute Layout`以外を使う時は以下の2つが**必ず必要**です。
30
+ 纏めると`Swing`で`FlowLayout`以外のLayoutを使う時は以下の2つが**必ず必要**です。
26
- a. `JPanel#setLayout`で`FlowLayout`以外の`Layout`という旨を`Swing`に通知する。
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

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

2018/08/14 16:11

投稿

umyu
umyu

スコア5846

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. `Swing`の画面は`setLayout`で全体(`JPanel`)レイアウト指定
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

追記

2018/08/14 16:03

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -21,13 +21,13 @@
21
21
 
22
22
  `layout`属性に`BorderLayout`が存在しない=`BorderLayout`を指定していない。
23
23
 
24
- 0. `Swing`の画面は`setLayout`で全体(`JPanel`)のレイアウトを指定。
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
- 0. `add`時の第二引数で`JPanel`のどこに配置するのかを指定。
30
+ b. `JPanel#add`時の第二引数でどこに配置するのかを指定。
31
31
  ```Java
32
32
  this.panel.add(scene1, "menue"); // ←この行
33
33
  ```

1

追記

2018/08/14 15:54

投稿

umyu
umyu

スコア5846

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
- [2ヶ月前にその旨、回答した記憶がるのですが……](https://teratail.com/questions/129500)
41
+ と`Swing`画面レイアウトを作成る時は、[WindowBuilder](https://teratail.com/questions/129500)を使ってくださいな。