🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1979閲覧

JFrame内での滑らかな更新がされない (質問タイトルが当たっているか微妙)

cretter

総合スコア91

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/12/14 22:16

編集2020/12/16 09:14

前提・実現したいこと

JFrame内でspaceを押すと赤色のJPanelを一定間隔で0.01秒おきに右側に移動させるようにして、赤が進むようになっています。しかし、実際にspaceを押すと下のコードの赤を進ませるfor文が終了した状態で赤が表示されています。つまり、赤が進んでいるように見えません。理想は、for文の途中で毎回赤を表示させて赤が移動して進んでいるように見えるようにしたいです。ソースコード2がいい例でこれだとforの途中でも表示されます。どうすれば1forが終了した状態で表示されるのではなく2のようにforの途中で毎回表示できるようになりますか。
簡単なサンプルコードもお願いします。

該当のソースコード

1

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.*; 4public class test02 extends JFrame implements KeyListener{ 5 int x=51,y=51;//xとy座標 6 JPanel panel,ball; 7 public static void main(String[] args){ 8 test02 cl = new test02("test02"); 9 } 10 test02(String title){ 11 setTitle(title); 12 setBounds(93,100,600,400); 13 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 14 15 setLayout(null); 16 17 panel = new JPanel(); 18 panel.setBackground(Color.BLACK); 19 panel.setBounds(x,y,50,50); 20 21 ball = new JPanel(); 22 ball.setBackground(Color.RED); 23 24 add(panel); 25 add(ball); 26 setResizable(false); 27 setVisible(true); 28 29 addKeyListener(this);//KeyListener 30 } 31 @Override 32 public void keyTyped(KeyEvent e){/*何かのキー(aなど)を押した場合の処理*/} 33 @Override 34 public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/ 35 switch(e.getKeyCode()){ 36 case KeyEvent.VK_UP://上キー 上移動 37 y-=3; 38 break; 39 case KeyEvent.VK_DOWN://下キー 下移動 40 y+=3; 41 break; 42 case KeyEvent.VK_LEFT://左キー 左移動 43 x-=3; 44 break; 45 case KeyEvent.VK_RIGHT://右キー 右移動 46 x+=3; 47 break; 48 case KeyEvent.VK_SPACE://スペースキー 49 for(int i=x;i<x+350;i+=10){ 50 ball.setVisible(false); 51 ball.setBounds(i,y,10,10); 52 ball.setVisible(true); 53 try{ 54 Thread.sleep(1); 55 }catch(Exception a){ 56 } 57 } 58 break; 59 } 60 panel.setBounds(x,y,50,50); 61 if(x<0||x>537||y<0||y>315){ 62 System.out.println("DEATH"); 63 } 64 } 65 @Override 66 public void keyReleased(KeyEvent e){/*キーを離した際の処理*/} 67}

2

1import javax.swing.*; 2import java.awt.*; 3public class test01 extends JFrame{ 4 public static void main(String[] args){ 5 test01 f = new test01(); 6 } 7 test01(){ 8 setBounds(100,100,500,500); 9 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 10 getContentPane().setBackground(Color.WHITE); 11 setLayout(null); 12 setVisible(true); 13 14 JPanel panel = new JPanel(); 15 panel.setBackground(Color.RED); 16 panel.setBounds(100,100,10,10); 17 add(panel); 18 19 while(true){ 20 try{System.in.read();}catch(Exception e){} 21 for(int i=0;i<500;i++){ 22 panel.setBounds(i,100,10,10); 23 try{Thread.sleep(10);}catch(Exception e){} 24 } 25 } 26 } 27}

補足情報(FW/ツールのバージョンなど)

java jdk-14.0.2

java version "14.0.2" 2020-07-14
Java(TM) SE Runtime Environment (build 14.0.2+12-46)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

できればサンプルコードが欲しいです。

キーワードは提示しましたが。

今回の描写ではswingutilities.invokelaterをどのように使えばいいですか?

あなたのソースに手を入れるつもりはないので、単純なサンプルを。

java

1import javax.swing.*; 2import java.awt.*; 3import java.time.LocalDateTime; 4 5public class xxHogege 6 extends JFrame { 7 public static void main(String[] args) throws Exception { 8 new xxHogege().setVisible(true); 9 } 10 11 xxHogege() { 12 final JPanel panel = new JPanel(); 13 panel.setLayout(new FlowLayout()); 14 15 final JLabel label = new JLabel("xxxxxxxxxx"); 16 panel.add(label); 17 18 // 19 final JButton buttonA = new JButton("start(A)"); 20 panel.add(buttonA); 21 22 buttonA.addActionListener((ev) -> { 23 label.setText("start"); 24 final LocalDateTime stop = LocalDateTime.now().plusSeconds(10); 25 while (LocalDateTime.now().compareTo(stop) < 0) { 26 try { 27 final String text = LocalDateTime.now().toString(); 28 System.out.println(text); 29 label.setText(text); 30 Thread.sleep(100); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 } 34 } 35 }); 36 37 // 38 final JButton buttonB = new JButton("start(B)"); 39 panel.add(buttonB); 40 41 buttonB.addActionListener((ev) -> { 42 label.setText("start"); 43 new Thread(() -> { 44 final LocalDateTime stop = LocalDateTime.now().plusSeconds(10); 45 while (LocalDateTime.now().compareTo(stop) < 0) { 46 try { 47 SwingUtilities.invokeLater(() -> { 48 final String text = LocalDateTime.now().toString(); 49 System.out.println(text); 50 label.setText(text); 51 }); 52 Thread.sleep(100); 53 } catch (Exception e) { 54 e.printStackTrace(); 55 } 56 } 57 }).start(); 58 }); 59 60 add(panel, BorderLayout.CENTER); 61 setSize(150, 200); 62 } 63}

投稿2020/12/19 00:32

shiketa

総合スコア4054

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cretter

2020/12/20 08:40

わかりやすいサンプルありがとうございます。 とても参考になりました。
guest

0

java

1 @Override 2 public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/ 3... 4 case KeyEvent.VK_SPACE://スペースキー 5 for(int i=0;i<350;i+=50){//赤を右移動 6 ball.setBounds(i,y,10,10); 7 try{ 8 Thread.sleep(1000); 9 }catch(Exception a){ 10 }

keyPressedは、イベントディスパッチスレッドで実行される。
イベントディスパッチスレッドで、sleep()していると、Swingはその間に発生するさまざまなイベントを処理できない。あなたが発生させた再描画イベントも。
だから、for文が終了した状態で赤が表示される。
定期的に再描画したいのであれば、イベントディスパッチスレッドとば別のスレッドでsleep()し、SwingUtilities.html#invokeLater()などを使って、描画する必要がある。

投稿2020/12/15 00:59

shiketa

総合スコア4054

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cretter

2020/12/15 05:04

できればサンプルコードが欲しいです。
cretter

2020/12/16 09:25

今回の描写ではswingutilities.invokelaterをどのように使えばいいですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問