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

回答編集履歴

5

反映されないーーーー。

2018/01/06 13:53

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -96,9 +96,7 @@
96
96
  lblScore.setForeground(Color.RED);
97
97
  lblScore.setHorizontalAlignment(SwingConstants.CENTER);
98
98
  add(lblScore);
99
-
100
99
  }
101
-
102
100
  }
103
101
  ```
104
102
 

4

文字色の変更が抜けていたので追記

2018/01/06 13:53

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -77,7 +77,6 @@
77
77
 
78
78
  @SuppressWarnings("serial")
79
79
  public class GameOver extends JPanel {
80
-
81
80
  /**
82
81
  * Create the panel.
83
82
  */
@@ -87,11 +86,14 @@
87
86
  setLayout(new BorderLayout(0, 0));
88
87
  // drawStringはコンポーネントの領域を計算する必要があるので、文字列を表示するだけならJLabelの方がいいです。
89
88
  JLabel lblGameOver = new JLabel("GameOver");
89
+ // 文字色を赤色にする。
90
+ lblGameOver.setForeground(Color.RED);
90
91
  lblGameOver.setVerticalAlignment(SwingConstants.TOP);
91
92
  lblGameOver.setHorizontalAlignment(SwingConstants.CENTER);
92
93
  add(lblGameOver, BorderLayout.NORTH);
93
94
 
94
95
  JLabel lblScore = new JLabel("Score");
96
+ lblScore.setForeground(Color.RED);
95
97
  lblScore.setHorizontalAlignment(SwingConstants.CENTER);
96
98
  add(lblScore);
97
99
 

3

countdown_secの判定が誤っていたので修正。

2018/01/06 13:52

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -45,16 +45,17 @@
45
45
  add(labelPanel, "title_window");
46
46
  timer = new Timer(1000, (e) -> {
47
47
  label.setText(String.valueOf(countdown_sec));
48
- countdown_sec--;
49
- if (countdown_sec == -1) {
48
+ if (countdown_sec ==-1){
50
49
  timer.stop();
51
- // GameOver画面に表示を切り替える。
52
50
  showPanel("gameover_window");
51
+ return;
53
52
  }
53
+ countdown_sec--;
54
54
  });
55
55
  JPanel game_over = new GameOver();
56
56
  add(game_over, "gameover_window");
57
-
57
+ // コンストラクタ内からTimer(別スレッド)をスタートするのはスレッドの可視性の関係上あまり良くないです。
58
+ // frame.setVisible(true);後に別のメソッドより、timer.startを呼び出す形に変更したほうがいいです。
58
59
  timer.start();
59
60
  }
60
61
 

2

コンポネントツリーの出力を追記

2018/01/06 02:26

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -97,4 +97,7 @@
97
97
  }
98
98
 
99
99
  }
100
- ```
100
+ ```
101
+
102
+ □補足
103
+ 作った画面のSwingのコンポーネント配置が知りたい時は画面をクリックした状態で、Ctrl+Shift+F1キーを押下すると、Swingのコンポーネントツリーがコンソールに出力されます。

1

内容を追記

2018/01/05 12:31

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,7 +1,11 @@
1
+ 質問文のソースコードがJFrame#paintをオーバーライドしている状態で、
1
- レイアウトマネージャをCardLayoutにして、GameOverパネルに表示を切り替えサンプルソースコードす。
2
+ ContentPaneJPanel (labelPanel)を追加してるコードなため、描画処理の依存関係が破綻しています。
3
+ paint処理を治すのが手間なので、アプローチ方法を変更しました。
4
+
5
+ JFrameのレイアウトマネージャを[CardLayout](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/CardLayout.html)にして、GameOverパネルに表示を切り替えるサンプルソースコードです。
2
6
  □注意点
3
- Swingのコンポーネントを継承したクラスでpaintメソッドはオーバライドしないでください。
7
+ Swingのコンポーネント(JFrame/JPanel)を継承したクラスでpaintメソッドはオーバライドしないでください。
4
- どうしてもオーバーライドしたい時はpaintComponentsをオーバーライドしてください。
8
+ どうしてもオーバーライドしたい時は[paintComponent](https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JComponent.html#paintComponent-java.awt.Graphics-)をオーバーライドしてください。
5
9
 
6
10
 
7
11
  Q107683.java