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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

3455閲覧

swing  ボタンを押すと、png画像が動くようにしたいです。

yuyu__

総合スコア26

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2016/08/18 11:42

編集2016/08/19 09:01

###前提・実現したいこと
swing+少しAWTでキャラクターが動くウインドウを作っています。
現在、パネル(1)が表示されている状態で、そこにはボタンが表示されています。
ボタンを押すと、そのパネル(1)は非表示となり、パネル(2)が非表示から表示になります。
(本当は、パネル(1)は非表示ではなく、破棄でも良いのですが、コードがわかりませんでした。)
パネル(2)にpng画像が入っており、画像が10pxほど上下に動くようにしたいです。
また、ちらつきも無くしたいです。

Graphics gに画像を入れる場合、直接その画面に表示してアニメーションを起こすことはできたのですが、
後で表示する方法がわかりませんでした。
ImageIconの場合はLabelに入れていますが、動きませんでした。

BufferedImage(Graphics g)の場合と、ImageIconの場合で試してますが、パネル(2)の画像が動かなかったり、出てこない、または動いても2枚重ねになってしまいます。
###該当のソースコード

BufferedImage gazou1 = null; //Graphics gの場合の画像 /* Graphics gの場合 */ try{ gazou1 = ImageIO.read(new File("C:\\Users\\Owner\\Desktop\\gazou\\gazou1.png")); }catch(IOException ioe){} /* ボタン操作 */ public void actionPerformed(ActionEvent e){ String bstring = e.getActionCommand(); if(bstring.equals("* 閉じる")){ panel.setVisible(false); //gazouplay(); } } public void run(){} //ImageIconの場合 public void gazouplay(){ panel2.setVisible(true); ImageIcon gazou1 = new ImageIcon("C:\\Users\\Owner\\Desktop\\gazou\\gazou1.png"); label2 = new JLabel(); label2.setIcon(gazou1); label2.setVisible(true); panel2.add(label2); Container con = getContentPane(); con.add(panel2); } //paint? paintComponent? Graphics gの場合 public void paintComponent(Graphics g){ g.drawImage(gazou1,200,450,360,500,panel2); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

透明フレーム+透明PNGを使ってアニメーションさせる場合、repaint()ではなく、
SwingUtilities.updateComponentTreeUI()を使って親のコンポーネントごと
再描画させないとダメみたいです。

下記の質問が似たような現象だったので、参考になるかも知れません。

Java - JavaのJlabelのsetIconの画像がクリアできない(43816)|teratail
https://teratail.com/questions/43816

ご希望通りにちらつきが抑えられるかどうかは分かりません。
Swingだとこれが限界かも知れません。

投稿2016/08/20 12:21

argius

総合スコア9388

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

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

yuyu__

2016/08/25 12:14

回答いただきありがとうございます。実は知識不足でまだ解決できていません。もう少し知識を増やしてから再チャレンジしてみようと思います。 ただ、回答いただいた内容は、今後の学習に生かしていきたいと思います。 またよろしくお願いします。
argius

2016/08/25 12:26 編集

では今後のために、ちょっとだけ補足です。 Swingでアニメーションさせる場合、一定のタイミングでrepaint()を呼び出すことで、明示的に再描画を行うように促すというテクニックがあります。 キーワード"swing アニメーション repaint"辺りでググれば色々見つかると思います。 (当たり外れあるかもですけど...) 今回のケースのように、透明フレームを使っている場合だと、repaintでは上手く行かないので、代わりにSwingUtilities.updateComponentTreeUI()を上位のコンポーネントに使えば(上位のコンポーネントごと再描画すれば)解消する、という意味でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問