質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.37%
Java

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

Q&A

解決済

2回答

1474閲覧

画像が切り替わらないことについて

soragonn_

総合スコア3

Java

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

0グッド

0クリップ

投稿2021/08/28 12:19

編集2021/08/28 12:21

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
javaでおみくじを作ってます

guiで画像表示もしました

発生している問題・エラーメッセージ

エラーメッセージ ```なし ### 該当のソースコード ```ここに言語名を入力 java ```import javax.swing.*; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.Color; import java.awt.GridLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class omikuzi extends JFrame{ public static void main(String[] args){ omikuzi frame = new omikuzi(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(600,600); frame.setTitle("おみくじ"); frame.setVisible(true); } ImageIcon image = new ImageIcon("zinnzya.jfif"); omikuzi(){ JLabel lbl = new JLabel(image); JLabel label = new JLabel("抽選ボタンを押してください。"); label.setPreferredSize(new Dimension(300,300)); label.setVisible(true); label.setBounds(100, 210, 280, 30); label.setBackground(Color.red); label.setOpaque(true); JPanel p = new JPanel(); p.setLayout(null); lbl.setIcon(image); setLayout(new GridLayout(2, 1,5,5)); add(lbl); JButton button1 = new JButton("抽選"); int r = new java.util.Random().nextInt(6); button1.setBounds(100, 0, 80, 30); button1.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e){ label.setText("抽選中・・・"); if (r == 0) {image = new ImageIcon("zinnzyan.jfif");//これが写らない lbl.setIcon(image); try{Thread.sleep(1000);}catch(InterruptedException a){} image = new ImageIcon("kyou.jfif");//これは写る lbl.setIcon(image); label.setText("今日の運勢は凶です。");} if (r == 1) { image = new ImageIcon("zinnzyan.jfif");//これが写らない lbl.setIcon(image); try{Thread.sleep(1000);}catch(InterruptedException a){} image = new ImageIcon("syoukiti.jfif");//これは写る lbl.setIcon(image); label.setText("今日の運勢は小吉です。");} if (r == 2) {image = new ImageIcon("zinnzyan.jfif");//これが写らない lbl.setIcon(image); try{Thread.sleep(1000);}catch(InterruptedException a){} image = new ImageIcon("suekiti.jfif");//これは写る lbl.setIcon(image); label.setText("今日の運勢は末吉です。");} if (r == 3) { image = new ImageIcon("zinnzyan.jfif");//これが写らない lbl.setIcon(image); try{Thread.sleep(1000);}catch(InterruptedException a){} image = new ImageIcon("kiti.jfif");//これは写る lbl.setIcon(image); label.setText("今日の運勢は吉です。");} if (r == 4) {image = new ImageIcon("zinnzyan.jfif");//これが写らない lbl.setIcon(image); try{Thread.sleep(1000);}catch(InterruptedException a){} image = new ImageIcon("daikiti.jfif");//これは写る lbl.setIcon(image); label.setText("今日の運勢は大吉です。");} if (r == 5) { image = new ImageIcon("zinnzyan.jfif");//これが写らない lbl.setIcon(image); try{Thread.sleep(1000);}catch(InterruptedException a){} image = new ImageIcon("tyuukiti.jfif");//これは写る lbl.setIcon(image); label.setText("今日の運勢は中吉です。");} } }); p.add(button1); p.add(label); getContentPane().add(p, BorderLayout.CENTER); } } ### 試したこと 画像がいかんのかなと思って変えてみたが変わらなかった ### 補足情報(FW/ツールのバージョンなど) JDK java

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

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

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

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

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

guest

回答2

0

Swing は、setIcon をすれば即表示されるものではありません。ボタンを押して実行される actionPerformed メソッドの場合は、そのメソッドが終わってから setIcon の効果が現れます。
複数回 setIcon をしていても、表示されるのは最後に実行したものだけです。いくら sleep しても actionPerformed を実行している限り意味はありません。

ついでに、actionPerformed 等画面を構成するものから呼ばれるメソッド内では、一秒でも止まってはいけません。その間は Swing が反応しなくなってしまうためです。

上記のような現象は、"EDT(イベント・ディスパッチ・スレッド)"や"シングルスレッド"といったワードで検索されると情報があると思いますので、お調べになっては如何でしょうか。

投稿2021/08/28 17:57

jimbe

総合スコア13168

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

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

soragonn_

2021/08/29 01:59

どちらもありがとうございます。 どっちもベストアンサーです!
guest

0

ベストアンサー

GUI物ではThread.sleepはタブーです。
一切操作ができなくなりますし、質問のように思った動作になりません。

基本的にはタイマーを使うことになります。
Timer (Java Platform SE 8 )

Java

1import java.awt.Color; 2import java.awt.GridLayout; 3import java.awt.event.ActionEvent; 4import java.net.MalformedURLException; 5import java.net.URL; 6import java.util.Random; 7import javax.swing.ImageIcon; 8import javax.swing.JButton; 9import javax.swing.JFrame; 10import javax.swing.JLabel; 11import javax.swing.JPanel; 12import javax.swing.SwingUtilities; 13import javax.swing.Timer; 14 15 16public class Omikuzi extends JFrame { 17 public static void main(String[] args) throws MalformedURLException { 18 Omikuzi frame = new Omikuzi(); 19 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 20 frame.setSize(600, 600); 21 frame.setLocationRelativeTo(null); 22 frame.setTitle("おみくじ"); 23 frame.setVisible(true); 24 } 25 26 private final ImageIcon jinjaIcon = new ImageIcon(new URL("https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg")); 27 private final ImageIcon daikitiIcon = new ImageIcon(new URL("https://teratail-v2.storage.googleapis.com/uploads/avatars/u19/195094/hlb8TKl6_thumbnail.jpg")); 28 private final JLabel messageLabel = new JLabel("抽選ボタンを押してください。"); 29 private final JLabel imageLabel = new JLabel(jinjaIcon); 30 31 private final Random random = new Random(); 32 private final Timer timer = new Timer(1000, this::onTimer); 33 34 private String kekkaText; 35 private ImageIcon kekkaIcon; 36 37 Omikuzi() throws MalformedURLException { 38 messageLabel.setBounds(100, 210, 280, 30); 39 messageLabel.setBackground(Color.RED); 40 messageLabel.setOpaque(true); 41 42 JButton button1 = new JButton("抽選"); 43 button1.setBounds(100, 0, 80, 30); 44 45// button1.addActionListener(new ActionListener() { 46// @Override public void actionPerformed(ActionEvent e) { 47// onClick(e); 48// } 49// }); 50 // ↑が↓こうなって 51// button1.addActionListener(e -> onClick(e)); 52 // さらに↓こうなった(3つとも意味は同じ) 53 button1.addActionListener(this::onClick); 54 55 JPanel panel = new JPanel(null); 56 panel.add(button1); 57 panel.add(messageLabel); 58 59 setLayout(new GridLayout(2, 1, 5, 5)); 60 add(imageLabel); 61 add(panel); 62 } 63 64 private void onTimer(ActionEvent e) { 65 timer.stop(); 66 imageLabel.setIcon(kekkaIcon); 67 messageLabel.setText(kekkaText); 68 } 69 70 private void onClick(ActionEvent e) { 71 messageLabel.setText("抽選中・・・"); 72 imageLabel.setIcon(jinjaIcon); 73 74 switch (random.nextInt(6)) { 75 case 0: 76 case 1: 77 case 2: 78 kekkaIcon = daikitiIcon; 79 kekkaText = "今日の運勢は大吉です。"; 80 timer.start(); 81 break; 82 case 3: 83 case 4: 84 case 5: 85 // どうしても Thread.sleep したいならこんなん 86 new Thread(() -> { 87 try { Thread.sleep(1000); } catch (Exception ignored) { } 88 SwingUtilities.invokeLater(() -> { 89 imageLabel.setIcon(daikitiIcon); 90 messageLabel.setText("今日の運勢は凶です。"); 91 }); 92 }).start(); 93 break; 94 } 95 } 96}

投稿2021/08/28 15:25

TN8001

総合スコア9801

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問