私は複数のパネルを持つアプリケーションを持っています。私は、異なるパネルの異なるレイアウトマネージャを自由に使用したいと思っていますが、ユーザがウィンドウのサイズを変更するのと同じように動作させたいと思います。GridBagLayoutを使用するこれらの3つのパネルで余分なスペースを使い分ける方法と、それらを一様にする方法
package example;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
public class TP1 extends JFrame
{
public static void main(String[] args)
{
TP1 tp1 = new TP1();
tp1.go();
}
public void go()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
// create a panel with some labels on it
JPanel innerFirst = new JPanel();
innerFirst.setLayout(new BoxLayout(innerFirst, BoxLayout.PAGE_AXIS));
innerFirst.add(new JLabel("one"));
innerFirst.add(new JLabel("two"));
innerFirst.add(new JLabel("three"));
innerFirst.add(new JLabel("four"));
// put that panel in a scroll pane
JScrollPane firstSP = new JScrollPane(innerFirst);
// make another panel and put our scrolled panel in it
JPanel outerFirst = new JPanel();
outerFirst.setLayout(new BoxLayout(outerFirst, BoxLayout.PAGE_AXIS));
outerFirst.add(firstSP);
// create a GridBagLayout panel with some text fields on it
JPanel innerSecond = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = .25;
gbc.anchor = GridBagConstraints.LINE_START;
innerSecond.add(new JTextField(8), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
innerSecond.add(new JTextField(10), gbc);
gbc.gridx =0;
gbc.gridy = 2;
innerSecond.add(new JTextField(12), gbc);
// put that panel in a scroll pane
JScrollPane secondSP = new JScrollPane(innerSecond);
// make another panel and put our second scrolled panel in it
JPanel outerSecond = new JPanel();
outerSecond.setLayout(new BoxLayout(outerSecond, BoxLayout.LINE_AXIS));
outerSecond.add(secondSP);
JPanel innerThird = new JPanel(new GridBagLayout());
GridBagConstraints gbc3 = new GridBagConstraints();
gbc3.anchor = GridBagConstraints.LINE_END;
gbc.weightx = .25;
gbc3.gridx = 0;
gbc3.gridy = 0;
innerThird.add(new JLabel("1st label"), gbc3);
gbc3.gridy = 1;
innerThird.add(new JLabel("second label"), gbc3);
gbc3.gridy = 2;
innerThird.add(new JLabel("IIIrd label"), gbc3);
gbc3.anchor = GridBagConstraints.LINE_START;
gbc3.gridx = 1;
gbc3.gridy = 0;
innerThird.add(new JTextField(8), gbc3);
gbc3.gridy = 1;
innerThird.add(new JTextField(12), gbc3);
gbc3.gridy = 2;
innerThird.add(new JTextField(14), gbc3);
JScrollPane thirdSP = new JScrollPane(innerThird);
JPanel outerThird = new JPanel();
outerThird.setLayout(new BoxLayout(outerThird, BoxLayout.LINE_AXIS));
outerThird.add(thirdSP);
// put the scrolled panes onto a tabbed pane
JTabbedPane tp = new JTabbedPane();
tp.add("text fields", outerSecond);
tp.add("labels", outerFirst);
tp.add("mixed", outerThird);
// add the tabbed pane to the frame
this.add(tp);
// pack it and ship it.
pack();
setVisible(true);
}
}
上記のコードを実行すると、3つのタブがあるタブ付きウィンドウが表示されます。ウィンドウを小さくすると、すべてのウィンドウにスクロールバーが表示されます。大きなものを作成すると、3つの動作が異なります。ラベルの付いたタブはウィンドウの左上にのみ表示され、フィールドのあるタブは左端に垂直に配置され、グリッドバッグにはラベルとフィールドが混在します拡大されたウィンドウ内にそれらを水平および垂直の両方に配置します。
これはアプリケーションでは受け入れられません。このようにすべてのパネルを同じように動作させる必要があります。私はスクロールバーを持つためにそれらをすべて必要とし、ウィンドウが内部パネルよりも大きくなると、それらのすべてを左上に保持したいと思います。
もう1つの要件:私のタブはJPanelを拡張するもので占有されていますが、JScrollPaneを直接タブに配置する前に私は言いましたが、私のアプリケーションではそうしたくありません。それは他のものを必要以上に複雑にするだけです。
これらの3つの状況が異なる動作をしている理由を理解することを大変嬉しく思っています。私は、左右の例をコピーし、試行錯誤して仕事をするまでは、私たちがやっていることの背後にある原則を理解すれば、私たちはもっと良くなると考えています。
(ちなみに、私は左上に引き寄せているように見えるんGroupLayoutパネルを持っているが、それは私の質問のために必要だったとは思いませんでしたし、それがあるとして、これはコードの100行である。)
別のバージョンを投稿しているはずです.LINE_STARTとFIRST_LINE_STARTを使って試しました。その場所、およびそれはラベルの位置を変更しません。 FIRST_LINE_STARTは、私が後にあるように物を左上隅に配置することになっていますが、何らかの理由でここにはありません。なぜ誰が知っていますか? – arcy
@rcook:gbc.weighty = 0.1のようなものを追加してみてください。次に、物事を行う、それは場所を変更します。 –
さて、それは物事を変えました - 3つのテキストフィールドがパネル全体に垂直に広がっています。ラベルを貼り付ける方法はありますか?私はまだラベルが違うふうに振る舞っているのだろうと思っています。 – arcy