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

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

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

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

Q&A

解決済

1回答

4100閲覧

イメージを表示するタイミングを調整できません

OMDM1991

総合スコア25

Java

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

0グッド

0クリップ

投稿2015/08/06 11:50

下記のソースコードで実行してみたところ、自分ではAの画像が最初に背景のように表示されてその1秒後にBの画像が出ることを想定していたのですが、実際に試すと最初に何も表示されていないウインドウが出てその後にAとBの画像が両方同時に表示されてしまいます。どうすれば改善できるでしょうか?

java

1import java.awt.*; 2import javax.swing.*; 3import javax.imageio.*; 4import java.util.Random; 5 6//============================================================================== 7//メイン・クラス 8//============================================================================== 9public class Key_test2 10{ 11 //メイン・メソッド 12 public static void main(String[] args) 13 { 14 Key_test2 test = new Key_test2(); 15 } 16 public Key_test2() 17 { 18 //基礎フレームの設定。 19 JFrame frame = new JFrame(); 20 frame.setSize(500,500); 21 frame.setTitle("Key_test2"); 22 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 23 frame.add(new MainPanel()); 24 frame.setVisible(true); 25 } 26} 27class MainPanel extends JPanel { 28 public MainPanel() { 29 //setBackground(Color.white); 30 31 } 32 public void paintComponent(Graphics g) { 33 //画像を引数に入れる 34 Image A = getToolkit().getImage("A.png"); 35 Image B = getToolkit().getImage("B.png"); 36 // 座標を指定しイメージオブジェクトを表示 37 g.drawImage(A ,0,0, this); 38 39 try{ 40 Thread.sleep(1000); 41 // 座標を指定しイメージオブジェクトを表示 42 g.drawImage(B ,0,0, this); 43 } 44 catch(InterruptedException e){ 45 System.out.println("error"); 46 } 47 } 48}

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

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

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

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

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

guest

回答1

0

ベストアンサー

paintComponent()の中で表示タイミングを制御することはできません。また、paintComponent()自体は極力短い時間で完了させないと表示がちらついたりします。

タイミングは別の場所で制御して、状態だけを書き換えるようにします。
例えば、「Bを描画する」というbooleanのフラグを持たせておき、それをタイミングで切り替えます。フラグを書き換えた後、すぐに再描画されるようにrepaint()を呼びます。
paintComponent()ではそのフラグの状態によってどちらを表示するかを判断するようにします。

  • 実装例

lang

1import java.awt.Graphics; 2import java.awt.Image; 3import java.util.concurrent.Executors; 4import java.util.concurrent.ScheduledExecutorService; 5import java.util.concurrent.TimeUnit; 6import javax.swing.JFrame; 7import javax.swing.JPanel; 8 9//============================================================================== 10//メイン・クラス 11//============================================================================== 12@SuppressWarnings("unused") 13public class Key_test2 { 14 //メイン・メソッド 15 public static void main(String[] args) { 16 Key_test2 test = new Key_test2(); 17 } 18 public Key_test2() { 19 //基礎フレームの設定。 20 JFrame frame = new JFrame(); 21 frame.setSize(500, 500); 22 frame.setTitle("Key_test2"); 23 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 24 frame.add(new MainPanel()); 25 frame.setVisible(true); 26 } 27} 28class MainPanel extends JPanel { 29 boolean useImageB = false; 30 public MainPanel() { 31 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 32 scheduler.scheduleAtFixedRate(new Runnable() { 33 @Override 34 public void run() { 35 useImageB = !useImageB; 36 repaint(); 37 } 38 }, 0L, 1L, TimeUnit.SECONDS); 39 } 40 public void paintComponent(Graphics g) { 41 String imageFileName; 42 if (useImageB) { 43 imageFileName = "B.png"; 44 } 45 else { 46 imageFileName = "A.png"; 47 } 48 //画像を引数に入れる 49 Image img = getToolkit().getImage(imageFileName); 50 // 座標を指定しイメージオブジェクトを表示 51 g.drawImage(img, 0, 0, this); 52 } 53}

投稿2015/08/06 13:14

argius

総合スコア9388

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問