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

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

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

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

Q&A

1回答

1205閲覧

actionPerformed

TakuyaAsaka

総合スコア7

Java

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

0グッド

0クリップ

投稿2017/06/28 22:48

java

1 public void actionPerformed(ActionEvent e) { 2 if(btn[0].isSelected()) { 3 if(btn[1].isSelected()) { 4 label.setIcon(img[0]); 5 p3.add(label); 6 } 7 } 8 }

トグルボタンの選択により、画像を表示するプログラムなのですが、
選択した状態でウィンドウサイズを変えないと画像が表示されないのですが、
repaint()も使えないし、どうしたら良いでしょう?

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

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

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

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

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

guest

回答1

0

画面の構成を変化させたとき(コンポーネントの適切な大きさが変化したとき)、swingのコンポーネント階層の制約を適切に設定していれば「自動的にコンポーネントのレイアウトが再計算されレイアウトが自動調整されるのですが、場合によっては明示的な再配置が必要になる場合があります。

  • Window#pack()

ウィンドウの大きさ自体が変化するような場合はこれを用います。JFrameもWindowの派生クラスですからpack()が使えます。

  • Component#revalidate()

コンポーネントのレイアウトのし直しを明示的に指示するにはこれを使います。

上記で期待通りの結果を得るためには、swingのレイアウトの「正しい方法」を知っておく必要があります。もしウィンドウのサイズや各コンポーネントのサイズや位置を「明示的に指定する」というやり方でレイアウトしているのであればpack()やrevalidate()を呼び出しても期待通りの結果を得られず、却ってレイアウトがくずれてしまうこともあります。

大雑把に言えば次のような点を注意しておくとよいと思います。

  • 適切なレイアウトマネージャーを用いる
  • 大きさは制約として与える

setMinimumSize, setPreferredSize, setMaximumSizeなどを用います。setBounds, setSize, setLocationは基本的に用いません。

  • JFrameの画面の初期化コードの最後にはpackを呼び出す

これをやっていないサンプルは(個人的には)swingのレイアウトを正しく示しているものとはいえないと思います。

詳細については以下のようなページが参考になります。
優れたGUIを構築する
今現在swingはJavaの標準ではなくなりましたが、この記事に書かれている「GUIのレイアウト戦略の考え方」については最新のJavaFXにも通じる部分があると思います。

質問者さんのコードとは若干異なりますが、簡単な例を挙げておきます。

java

1public class MyAppFrame extends JFrame { 2 public static void main(String[] args) { 3 new Zong().setVisible(true); 4 } 5 6 MyAppFrame() { 7 super("title"); 8 setDefaultCloseOperation(EXIT_ON_CLOSE); 9 10 Box box = Box.createVerticalBox(); 11 getContentPane().add(box, BorderLayout.CENTER); 12 13 JLabel label = new JLabel("no image"); 14 box.add(label); 15 16 JButton button = new JButton("set"); 17 box.add(button); 18 button.addActionListener(ev -> { 19 label.setIcon(new ImageIcon(getClass().getResource("big-image.png"))); 20 label.setText(""); 21 pack(); //ウィンドウの大きさも含めてレイアウトを再計算 22 }); 23 24 pack(); 25 } 26}

投稿2017/06/29 00:34

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問