##javaでゲーム制作をしています。
今はゲーム画面の画面移行を制作中です。
画面の移行前に、画面が固まるようになってきたので
処理が終わるまでNow Roading画面を挟みたいと思い
ThreadとRunnableを試したりしています。
###追伸
Teratailの投稿ボタンを押す → 何故か投稿できず
そのまま再度投稿すると、かなり前の文章になってしまいました。(何故?)
その為、編集前の文章で見ていたらごめんなさい。
追伸しました。
タイトルも…前のになっていたので追伸
動かない → 一部反映されない
##試した事
ボタン1は画面移行をする前に待機パネル(白)を表示させて
別スレッドで処理させています。処理順でパネル(黒)になります。
ボタン2は、別スレッドで動かしている間に、メインスレッドのプログラムが
動くか試しています。待機パネル(白)、時間が掛かりパネル変更(緑)
になりました。
ボタン3はボタン2とは違い、join()によって別スレッドが終わるまで
待機してから(黄)最後に待機パネル(白)が表示されました。
(黄)は早すぎるのか見えないけど…
joinが原因かもしれません…
ボタン4は、join()メソッドによって別スレッドの処理が全部終わるまで
終了されないか試しました。
##実現したい事
ここまでは自分の思う挙動範囲でした。しかし
ボタン5は、start()メソッド手前で白に背景を変えているのに
何故か変更されませんでした。
Class Eの方のpinkを外すと
別スレッドが終了してから白背景になりました。
別スレッドが起動前だから、起動前にパネルは白になるはず…
と思っていたのですが…
待機画面を出現させて、全部読み込ませてから
背景含め表示させたいと思っているので困っています。
##試した事
大変申し訳ないのですが、スレッドについて勉強中です。
とても簡素にして、挙動その物が合っているか試したのが
下記ソースコードとボタン1~4です。
ゲームで待機画面を出現させて、全部読み込ませてから
背景含め表示させようとしたのがボタン5です。
①別スレッドでなら背景色が変更になるか試す。
別スレッド内に記載したがならなかった。
②JFrameがそもそも変更できるかsetSizeを試す。
joinなし → 拡大後、背景が白→黒になる。
joinあり → 拡大後、背景変わらず、拡大した部分は黒くなり
拡大した部分を含めて背景色がピンクになる。
joinが原因なのは分かりました。
しかし、何故joinがこのような挙動をするか分かりません。
また、解決方法も教えて頂けたらと思っています。
ソースコードです。
java
1import java.awt.Color; 2import java.awt.Dimension; 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5 6import javax.swing.JButton; 7import javax.swing.JFrame; 8import javax.swing.JPanel; 9 10public class TestThread extends JFrame implements ActionListener, Runnable { 11 JPanel gamePanel = new JPanel(); 12 public JPanel getGamePanel() {return gamePanel;} 13 14 TestThread tt; 15 private int tBtn = -1; 16 17 public TestThread() { 18 tt = this; 19 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 20 this.setSize(new Dimension(500, 500)); 21 this.setVisible(true); 22 23 JButton btn1 = new JButton("ボタン1"); 24 JButton btn2 = new JButton("ボタン2"); 25 JButton btn3 = new JButton("ボタン3"); 26 JButton btn4 = new JButton("ボタン4"); 27 JButton btn5 = new JButton("ボタン5"); 28 29 btn1.setActionCommand("btn1"); 30 btn2.setActionCommand("btn2"); 31 btn3.setActionCommand("btn3"); 32 btn4.setActionCommand("btn4"); 33 btn5.setActionCommand("btn5"); 34 35 btn1.addActionListener(this); 36 btn2.addActionListener(this); 37 btn3.addActionListener(this); 38 btn4.addActionListener(this); 39 btn5.addActionListener(this); 40 41 gamePanel.add(btn1); 42 gamePanel.add(btn2); 43 gamePanel.add(btn3); 44 gamePanel.add(btn4); 45 gamePanel.add(btn5); 46 this.add(gamePanel); 47 } 48 49 public static void main(String[] args) { 50 TestThread testT = new TestThread(); 51 } 52 53 @Override 54 public void run() { 55 if (tBtn == 1) { 56 System.out.println("1画面、Now Roading 別スレッドで起動"); 57 for (int i = 0; i < 1000000; i++) { 58 System.out.println("iの数を数えましょう:" + i); 59 } 60 A a = new A(this); 61 } 62 if (tBtn == 2) { 63 System.out.println("2画面、Now Roading 別スレッドで起動"); 64 for (int i = 0; i < 1000000; i++) { 65 System.out.println("iの数を数えましょう:" + i); 66 } 67 B b = new B(this); 68 } 69 if (tBtn == 3) { 70 System.out.println("3画面、Now Roading 別スレッドで起動"); 71 for (int i = 0; i < 1000000; i++) { 72 System.out.println("iの数を数えましょう:" + i); 73 } 74 C c = new C(this); 75 } 76 if (tBtn == 4) { 77 System.out.println("4画面、Now Roading 別スレッドで起動"); 78 for (int i = 0; i < 1000000; i++) { 79 System.out.println("iの数を数えましょう:" + i); 80 } 81 D d = new D(this); 82 } 83 if(tBtn == 5) { 84 // こっちでも試す 85 this.getGamePanel().setBackground(Color.WHITE); 86 System.out.println("5画面、Now Roading 別スレッドで起動"); 87 for (int i = 0; i < 1000000; i++) { 88 this.getGamePanel().setBackground(Color.WHITE); 89 System.out.println("iの数を数えましょう:" + i); 90 } 91 E d = new E(this); 92 } 93 } 94 95 @Override 96 public void actionPerformed(ActionEvent e) { 97 String cmd = e.getActionCommand(); 98 if (cmd.equals("btn1")) { 99 System.out.println("btn1が押されたよ"); 100 this.setSize(600,600); 101 tBtn = 1; 102 Thread t = new Thread(this); 103 this.getGamePanel().setBackground(Color.WHITE); // 待機パネル 104 t.start(); 105 } 106 if (cmd.equals("btn2")) { 107 System.out.println("btn2が押されたよ"); 108 tBtn = 2; 109 Thread t = new Thread(this); // 待機パネル 110 t.start(); 111 // 処理が終わる前に白背景になっている。 112 this.getGamePanel().setBackground(Color.WHITE); 113 } 114 if (cmd.equals("btn3")) { 115 System.out.println("btn3が押されたよ"); 116 tBtn = 3; 117 Thread t = new Thread(this); 118 t.start(); 119 try { 120 t.join(); 121 } catch (InterruptedException e1) { 122 e1.printStackTrace(); 123 } 124 // ↓をコメントアウトすると黄背景になる。 125 this.getGamePanel().setBackground(Color.WHITE); 126 } 127 if (cmd.equals("btn4")) { 128 System.out.println("btn4が押されたよ"); 129 tBtn = 4; 130 this.getGamePanel().setBackground(Color.WHITE); 131 Thread t = new Thread(this); 132 t.start(); 133 try { 134 t.join(); // 別スレッドが終わるまで待機。ないと終了される。 135 } catch (InterruptedException e1) { 136 e1.printStackTrace(); 137 } 138 System.exit(0); 139 } 140 if (cmd.equals("btn5")) { 141 System.out.println("btn5が押されたよ"); 142 tBtn = 5; 143 this.getGamePanel().setBackground(Color.WHITE); 144 this.setSize(600,600); 145 // ここで、t.start()される前にPanelが白になるはず……? 146 // なのにならない。 147 Thread t = new Thread(this); 148 t.start(); 149 try { 150 // 試しにこっちでも 151 this.getGamePanel().setBackground(Color.WHITE); 152 t.join(); 153 } catch (InterruptedException e1) { 154 e1.printStackTrace(); 155 } 156 } 157 } 158} 159 160class A extends JPanel { 161 public A(TestThread testThread) { 162 System.out.println("classAの画面起動しました。"); 163 testThread.getGamePanel().setBackground(Color.BLACK); 164 } 165} 166 167class B extends JPanel { 168 public B(TestThread testThread) { 169 System.out.println("classBの画面が起動しました。"); 170 testThread.getGamePanel().setBackground(Color.GREEN); 171 } 172} 173 174class C extends JPanel { 175 public C(TestThread testThread) { 176 System.out.println("classCの画面が起動しました。"); 177 testThread.getGamePanel().setBackground(Color.YELLOW); 178 } 179} 180 181class D extends JPanel { 182 public D(TestThread testThread) { 183 System.out.println("classDの画面が起動しました。"); 184 } 185} 186 187class E extends JPanel { 188 public E(TestThread testThread) { 189 System.out.println("classEの画面が起動しました。"); 190 testThread.getGamePanel().setBackground(Color.PINK); 191 } 192}
##補足情報
Eclipse Java8
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/23 03:06
2021/06/23 04:42
2021/06/23 04:57