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

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

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

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

Swing

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

Q&A

解決済

1回答

1857閲覧

【java】Panelが指定したサイズにならない

suteaka

総合スコア13

Java

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

Swing

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

1グッド

0クリップ

投稿2022/01/14 10:46

編集2022/01/14 10:59

前提・実現したいこと

javaのswingを勉強しておりguiのプログラムを組もうとしていますが、下のコードで枠線表示させたパネルを300x100のサイズに設定していてもフレームのサイズになってしまいます。指定したサイズ300x100にしたいのですが何が原因なのでしょうか。(2つ目のタブ「機械2」のほうのパネルも同様に50x50のサイズにはなっていません。)

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

フレームは指定通り800x600になっているが、枠線表示しているパネルが300x100にならず、フレーム枠と同じになってしまう

該当のソースコード

java

1public class Hyouji_sample { 2 public static void main(String[] args) { 3 MyFrameSample mainframe = new MyFrameSample("表示", 800, 600); 4 mainframe.setLocationRelativeTo(null); 5 mainframe.setVisible(true); 6 } 7} 8 9class MyFrameSample extends JFrame{ 10 MyFrameSample(String title, int width, int height){ 11 setTitle(title); 12 setSize(width, height); 13 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 14 15 JTabbedPane tabbedpane = new JTabbedPane(); 16 17 Machine1 machine1 = new Machine1(); 18 Machine2 machine2 = new Machine2(); 19 20 tabbedpane.addTab("機械1", machine1); 21 tabbedpane.addTab("機械2", machine2); 22 23 getContentPane().add(tabbedpane, BorderLayout.CENTER); 24 } 25} 26 27class Machine1 extends JPanel{ 28 Machine1(){ 29 JLabel label = new JLabel(); 30 LineBorder border = new LineBorder(Color.RED, 2, true); 31 32 label.setText("sanpuru"); 33 34 add(label); 35 setPreferredSize(new Dimension(300, 100)); 36 setBorder(border); 37 } 38 39} 40 41class Machine2 extends JPanel{ 42 Machine2(){ 43 JLabel label = new JLabel(); 44 LineBorder border = new LineBorder(Color.RED, 2, true); 45 46 label.setText("sanpuru2"); 47 48 add(label); 49 setPreferredSize(new Dimension(50, 50)); 50 setBorder(border); 51 } 52 53}

コード実行時の状態

イメージ説明

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

setPreferredSizeはあくまで推奨サイズ(このくらいの大きさで表示してくれたらうれしいな)というだけで、どんなサイズになるかはレイアウト(LayoutManager)次第です。

A Visual Guide to Layout Managers (The Java™ Tutorials > Creating a GUI With Swing > Laying Out Components Within a Container)

例えばBorderLayoutではどこに入れるかによって、PreferredSizeの扱いが変わります。

Java

1import java.awt.BorderLayout; 2import java.awt.Color; 3import java.awt.Dimension; 4import javax.swing.JFrame; 5import javax.swing.JPanel; 6 7public class Sample extends JFrame { 8 public static void main(String[] args) { 9 new Sample().setVisible(true); 10 } 11 12 Sample() { 13 setSize(400, 300); 14 setLocationRelativeTo(null); 15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 17 JPanel p1 = new JPanel(); 18 p1.setBackground(Color.RED); 19 p1.setPreferredSize(new Dimension(100, 100)); 20 p1.setMaximumSize(new Dimension(100, 100)); 21 // MaximumSizeを設定しても無視される 22 p1.setMaximumSize(new Dimension(100, 100)); 23 // 上に入れた場合高さは100、幅はウィンドウ幅に引き伸ばされる 24 add(p1, BorderLayout.NORTH); 25 26 JPanel p2 = new JPanel(); 27 p2.setBackground(Color.GREEN); 28 p2.setPreferredSize(new Dimension(100, 100)); 29 // 左に入れた場合幅は100、高さは(ウィンドウからNORTH・SOUTH分を引いた高さに)引き伸ばされる 30 add(p2, BorderLayout.WEST); 31 32 JPanel p3 = new JPanel(); 33 p3.setBackground(Color.BLUE); 34 p3.setPreferredSize(new Dimension(100, 100)); 35 // 中央に入れた場合、どちらも100にならずに残りの空間を占有するようになる 36 add(p3, BorderLayout.CENTER); 37 } 38}

アプリ画像


Panelが指定したサイズにならない

実際このようなことをする意味はないと思います。
パネルの中でさらに細かく区切ってレイアウトするならわかりますが、パネル自体を固定サイズにしても使いにくいだけです。

が、もしやるとするならさらにパネルを入れ子にするしかない気がします(パネルの入れ子は普通のレイアウトでも使います)

Java

1class Machine1 extends JPanel { 2 Machine1() { 3 // Machine1自体は広がる 4 setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); 5 6 // 入れ子のこれを300,100で表示する 7 JPanel inner = new JPanel(); 8 inner.add(new JLabel("sanpuru")); 9 inner.setPreferredSize(new Dimension(300, 100)); 10 inner.setBorder(new LineBorder(Color.RED, 2, true)); 11 12 add(inner); 13 } 14}

投稿2022/01/14 13:15

編集2023/07/29 14:20
TN8001

総合スコア9326

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

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

suteaka

2022/01/15 11:41

ご回答ありがとうございます。setPreferredSizeはサイズ指定というよりも理想を記しただけでレイアウト次第なんですね。勉強になりました。 パネルにパネルを入れる方法はよくやっていてサイズ指定できていたからこそ、何で今回はうまくいかないんだと思っていましたが疑問が解決しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問