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

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

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

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

Swing

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

textbox

HTMLの<input type="text">で生成されるtextboxに関するタグです。

button

HTMLで用いる<button>タグです。

Q&A

解決済

1回答

2616閲覧

textAreaとLabel,Buttonの位置を分ける方法を教えてください。

ScorpionS

総合スコア7

Java

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

Swing

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

textbox

HTMLの<input type="text">で生成されるtextboxに関するタグです。

button

HTMLで用いる<button>タグです。

0グッド

0クリップ

投稿2017/11/20 10:25

編集2017/11/20 12:08

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
Javaで読書感想文などに使える便利ツールを作ろうとしています。
理想イメージ
これが僕の理想です。
###発生している問題・エラーメッセージ
buttonとlabelをtextareaの右側に置くために

> JPanel p1 = new JPanel(); //textarea用パネル p1.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 10)); GridLayout gl = new GridLayout(); JPanel p2 = new JPanel(); //button,label用パネル p2.setLayout(new GridLayout(5,1)); > JButton button1 = new JButton(); button1.setBorder(new   EtchedBorder(EtchedBorder.RAISED)); button1.setPreferredSize(new Dimension(80, 20)); button1.setText("リセット"); > p1.add(text1) p2.add(button1) > contentPane.add(p1, BorderLayout.WEST); contentPane.add(p2, BorderLayout.EAST);

と言う感じに分けてるんですが、
現実イメージ
このようになってしまいます。
これはおそらく
> contentPane.add(p1, BorderLayout.WEST);
contentPane.add(p2, BorderLayout.EAST);

ここが問題だと言うことはわかったんですがこれを使わずに分ける方法がわかりません。
GridLayoutでなくても構わないので実現できる方法を教えてください。

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

KSwordOfHaste

2017/11/20 11:40

言い忘れましたがタグにswingを追加した置いた方がよいです。
guest

回答1

0

ベストアンサー

追記:もう一つ言い忘れました。コードは>で表現するのではなくマークダウン(コード行の前後にバッククォート文字を3つ連続して書く)を使って本回答にあるようにしていただきたいです。質問編集画面でコードの行を選択し<code>ボタンを押すとそうできます。


レイアウトって難しいですよね・・・

何が最適かはある程度試してみて特徴をつかむ必要があると思いますが・・・

真ん中が空いてしまう原因:

BorderLayoutでの主役はCENTERにいるコンポーネントで、その周りは全てCENTERの邪魔にならないように控えめにレイアウトされると考えておくとよいと思います。(大雑把な表現でスミマセン)

対処案:

自分の場合、縦方向や横方向に連続して並ぶものはとりあえずBoxを最初に試すことにしています。本件の場合なら

text

1 Box(horizontal) 2 +-- JTextArea 3 +-- Box(vertical) 4 +-- JButton 5 +-- JTextField 6 +-- JTextField 7 +-- JLabel 8 ... etc. 9 +-- glue(※1) 10 11※1: 隙間を埋めるための軽量部品。Box.createVerticalGlue()で生成する

左右のバランスはTextAreaのpreferredSizeの横幅と右側にある一番大きな部品のpreferredSizeの横幅によって決まります。

なお、JFrameのcontentPaneにはデフォルトでBorderLayoutを持つJPanelになっていることはご存知と思いますが、例えば上記のようにしたいとき、デフォルトのJPanelをそのまま使わなくてはならないルールはないので、入れかえてしまってもよいですし、デフォルトのJPanelのCENTERへaddしてやってもよいでしょう。

Java

1public MyFrame extends JFrame { 2 public static void main(String[] args) { 3 SwingUtilities.invokeLater(() -> 4 new MyFrame().setVisible(true)); 5 } 6 7 class MyFrame() { 8 ... 9 Box hBox = Box.createHorizontalBox(); 10 ... 11 12 setContentPane(hBox); // (1) 13 getContentPane().add(hBox, BorderLayout.CENTER); // (2) 14 15 setDefaultCloseOperation(EXIT_ON_FRAME); 16 pack(); 17 } 18}

(1) or (2)いずれかを選択


なおGridLayoutも使えなくはないと思います。ただ、GridLayoutはROWS x COLUMNSの同じ大きさの区画に格子状に部品を並べるためのもので将棋盤のようなものなら一番適していますが、本件のようなものには今一つマッチしないと思います。というのは「全体を左右に分けて」=>「さらに右側を上下に分けて」=>「さらに・・・」というように階層的な構成を格子として考えるとrow span/column spanを使わざるを得ず、あまり自然な配置設計でない気がするのです。

投稿2017/11/20 11:37

編集2017/11/20 12:49
KSwordOfHaste

総合スコア18394

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

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

ScorpionS

2017/11/21 06:38

ご回答いただきありがとうございます。とてもご丁寧でわかりやすかったのですが、私はまだJava初心者なのでどのレイアウトが適しているかよく分かりません。使い方も教えて頂けるとうれしいです。
KSwordOfHaste

2017/11/21 06:51 編集

概ねこんな感じです。 Box hBox = Box.createHorizontalBox(); hBox.add(textArea); Box vBox = Box.createVirticalBox(); hBox.add(vBox); vBox.add(button); vBox.add(label); textArea.setPreferredSize(new Dimension(300, 200)); label.setPreferredSize(new Dimension(100, 20)); labelの横幅がvBox配下で一番幅が大きいならTextAreaとその右側の部品は3:1の比率になる・・・といった考え方です。レイアウトは他にsetMinimumSize, setMaximumSizeなども使って「制約を宣言する」考え方で行います。ここに書ききれないので調べたり研究してみてください。 なお、APIリファレンスのjavax.swingパッケージの下のクラスを一通り研究してみてください。 https://docs.oracle.com/javase/jp/8/docs/api/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問