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

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

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

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

Swing

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

Q&A

1回答

2666閲覧

JavaのSwingでのパネルの仕様について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Swing

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

0グッド

0クリップ

投稿2017/03/02 02:03

BorderLayoutクラスの定義とコンストラクタ
コンポーネント間の間隔を設定する

上記リンク先にそれぞれ

import javax.swing.*; import java.awt.BorderLayout; public class BorderLayoutTest1 extends JFrame{ public static void main(String[] args){ BorderLayoutTest1 frame = new BorderLayoutTest1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } BorderLayoutTest1(){ JButton button1 = new JButton("PAGE_START"); JButton button2 = new JButton("CENTER"); JButton button3 = new JButton("PAGE_END"); JButton button4 = new JButton("LINE_START"); JButton button5 = new JButton("LINE_END"); JPanel p = new JPanel(); p.setLayout(new BorderLayout()); p.add(button1, BorderLayout.PAGE_START); p.add(button2, BorderLayout.CENTER); p.add(button3, BorderLayout.PAGE_END); p.add(button4, BorderLayout.LINE_START); p.add(button5, BorderLayout.LINE_END); getContentPane().add(p, BorderLayout.CENTER); } }
import javax.swing.*; import java.awt.BorderLayout; public class BorderLayoutTest4 extends JFrame{ public static void main(String[] args){ BorderLayoutTest4 frame = new BorderLayoutTest4(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } BorderLayoutTest4(){ JButton button1 = new JButton("CENTER"); JButton button2 = new JButton("PAGE_START"); JButton button3 = new JButton("PAGE_END"); JButton button4 = new JButton("LINE_START"); JButton button5 = new JButton("LINE_END"); BorderLayout layout = new BorderLayout(); layout.setVgap(2); layout.setHgap(10); setLayout(layout); getContentPane().add(button1, BorderLayout.CENTER); getContentPane().add(button2, BorderLayout.PAGE_START); getContentPane().add(button3, BorderLayout.PAGE_END); getContentPane().add(button4, BorderLayout.LINE_START); getContentPane().add(button5, BorderLayout.LINE_END); } }

というコードが書いてありますが、なぜJPanelを使用しているまたは使用していないのでしょうか?
JPanelは必要ないのでしょうか?
JPanelを使った時と使わない時の違いを教えていただきたいです。

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

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

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

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

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

guest

回答1

0

事実はどちらのサンプルでもJPanelは使われています。
上のコードを把握するには「JFrameを生成すると次のコンポーネント階層が自動的に作成される」ことを知っている必要があります(APIリファレンスをよく読むと書いてあります)

// 簡単のために必要な階層だけ書いています。本当はJFrameはもう少し複雑な階層をもってます。 JFrame + contentPane (中身はJPaneでレイアウトはBorderLayout)

BorderLayoutTest1の方は元々contentPaneに設定されていたデフォルトのJPanelインスタンスの下に自分で生成したJPanelのインスタンスをぶらさげています。階層は次のようになります。

JFrame + contentPane(中身はJPaneでレイアウトはBorderLayout) +- 自分で生成したJPanel(この下にボタンが配置される)

一方BorderLayoutTest4の方はデフォルトで生成されているcontentPaneの中身(最初に示した階層にあるもの)をそのまま使っています。

なお、BorderLayoutTest4の方で、JFrame#setLayoutを使っていますが、このメソッドの実際の動作は「JFrameのcontentPaneに対してsetLayoutする」という動作をするので以下のように書いたのと同じです。

setLayout(layout);
はJFrameのメソッド上で書くと以下と同じ
getContentPane().setLayout(layout);

サンプルを見たとき「JFrameに対してsetLayoutしているけど、JFrameにレイアウト機能があるのだっけ?」とか「setContentPaneしてないのにgetContentPane().add(xxx)ができるということはJFrameを作っただけでcontentPaneには何か入っているはずだけどそれは何だろう?」といったことに気付くことができればその疑問を解決する過程で本回答の答えを見つけることができます。コードに少しでも疑問があればそれを放置せずに各個撃破しつつ読み進めるのが全体を理解する上でも大切と言えるでしょう。(言うは易しですが・・・)

投稿2017/03/02 05:12

KSwordOfHaste

総合スコア18394

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

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

退会済みユーザー

退会済みユーザー

2017/03/02 06:35

ご回答ありがとうございます。 ではなぜBorderLayoutTest1の方では自分で生成したJPanelのインスタンスを作成しているのでしょうか? これには何かメリットがあるのでしょうか?
KSwordOfHaste

2017/03/02 07:26 編集

特にないと思います。 途中に余分なJPanelが入るのをよしとしないという考え方もあるでしょうし、あまり必要性のないJPanelインスタンスがcontentPaneに挟まっていたとしても特に気にするほどではないとも考えられます。ただBorderLayoutTest1の方では「後からcontentPaneのJPanelインスタンスのCENTER以外の場所に別のコンポーネントを挿入できる余地がある」のでそれを期待する理由でこのような構成とすることはあるかも知れません。要するに画面構成をどう設計するかやどういう変更を想定するか次第です。
退会済みユーザー

退会済みユーザー

2017/03/02 08:00

詳しいご説明ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問