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

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

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

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

Q&A

解決済

1回答

3622閲覧

java JButtonにセットした画像のサイズが変わりません。

Launcher

総合スコア19

Java

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

0グッド

0クリップ

投稿2017/02/28 01:44

JButtonにくっつけた画像のサイズを変更したいです。

まず、ボタンのx座標y座標の配列
くっつける画像の配列と画像のサイズを指定する配列
ボタン自体の配列があります

drowというメソッドにこれをループで回して使用します。

java

1 public void paintComponent(Graphics g) { 2 super.paintComponent(g); 3 Graphics2D g2 = (Graphics2D)g; 4 int i=0; 5 if(mode==1){ 6 for(i=0;i<size;i++){ 7 RoundButton.drow(xPoint[i],yPoint[i],buttonSize[i], button.get(i),iconList.get(i)); 8 9 } 10 mode=0; 11 } 12 setOpaque(false); 13 } 14

メソッドdrowの中身は以下の通りです

①ImageIcon型では画像のサイズ変更ができないので、Image形に変更
②サイズの変更
③Icon型に戻す
④送られてきたbuttonにセットする
⑤ボタン自体のサイズも変更する
というものです。

java

1 public static void drow(int x, int y, int size,JButton button, ImageIcon imageIcon) { 2Image image = imageIcon.getImage(); 3Image scaledImage = image.getScaledInstance(size, size, Image.SCALE_SMOOTH); 4ImageIcon icon = new ImageIcon(scaledImage); 5 ④ button.setIcon(icon); 6 ⑤ button.setBounds(x, y, size, size); 7 } 8

これで画像のサイズが変わらないのはなぜでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを拝見すると「JBottonのアイコンや位置を変更することでその内容が画面に反映される」ことを利用してアニメーションを実現しようとしているように見えます。そうと仮定してコメントします。

コンポーネントの状態(位置・サイズ・アイコンなどの内容)を変更すると確かにそれは画面に反映されます。しかし「変更した時点で即座に反映されるのではない」という点に注意すべきです。状態の変更と画面反映は概ね次のような流れになると考えるとよいでしょう。(正確な反映タイミングは必ずしも以下のとおりとは限りませんがそれは重要ではなくワンクッション置いてから画面反映が行われる点がポイントです)

  1. コンポーネントの状態を変更

この際に起こることは「コンポーネントの内容が画面へ未反映である=dirtyである」と記録されることだけです。これはまた直接・間接に「repaintを呼び出す」ということを引き起こしますが、repaintを呼び出しても画面へはすぐに反映されないと考えた方が無難だと思います。

  1. 一旦Event Dispatch Loopへ戻る

コンポーネントの状態を変更したら(and/or repaintを呼び出したら)特に何もせずにそのままEvent Dispatch Loopへおとなしく戻ります。

  1. 再描画処理の起動

Event Dispatch Loopでは「ユーザーからの入力」や「再描画が必要なdirtyなコンポーネントが存在する」といった情報から適当なハンドラーメソッドが自動的に呼び出されます。本件の場合は再描画のためにpaint/paintComponentメソッドが呼び出され1で行った状態変更の結果が画面に反映されます。

ではどうアニメーションを実現するかといえば一般的には次のようにします。

  • 一定時間ごとに起動されるコールバックでコンポーネントの状態を少しずつ変える

Timerを使うと一定時間ごとに特定のコールバックをEDT上で呼び出してもらうことができます。そのコールバックの中で繰り返し起動される度にちょっとずつ違うコンポーネント状態へ変更してやります。

  • 描画(paintComponent)

大抵の場合アニメーションをするからと言って再描画メソッドをオーバーライドする必要はないと言えます。そもそもpaintComponentの役割は「現在のコンポーネントの内容に従って画面へ描画する」ことなのでコンポーネントの状態変更はしないほうがよいでしょう。

以下は簡単な例です。

java

1class MyFrame extends JFrame { 2 Timer timer; 3 4 JButton button; 5 6 MyFrame() { 7 // Timerのセットアップ 8 // (0.1秒ごとにonUpdateAnimationFrameを起動。これを無限に繰り返す) 9 timer = new Timer(100, ev -> onUpdateAnimationFrame()); 10 timer.setRepeats(true); 11 ... 12 } 13 ... 14 15 // アニメーション開始時に呼び出すべきメソッド 16 17 void onStartButtonAnimation() { 18 animationFrame = 0; 19 timer.start(); 20 } 21 22 int animationFrame; 23 24 // アニメーション中に0.1秒ごとに呼び出されるコールバック 25 26 void onUpdateAnimationFrame() { 27 // animationFrameに応じた位置やアイコンを設定 28 // ここでは状態を変更するだけであり再描画もここで起こると考えない方がよい。 29 updateButtonState(button, animationFrame++); 30 if (animationFrame > 5) 31 timer.stop(); // フレーム5まで変化させ終わったらタイマーを止める 32 } 33}

投稿2017/02/28 05:24

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問