2

ラベルを 2 行に配置しようとしていますGridBagLayoutが、一部のラベルを両方の行にまたがらせ、他のラベルを重ねて配置したいと考えています。のおよびプロパティのGridBagLayoutプロポーショナル サイズ変更機能のために、使用する必要があります。これは私が探しているレイアウトです:weightxweightyGridBagConstraints

+------------+------------+----------+----------+
| | | | | | ラベルC | | |
| | ラベルA | labelB |----------| ラベルD |
| | | | | | ラベルE | | |
+------------+------------+----------+----------+

問題は、labelEが下に配置されていることLabelAです。これが私のコードのレイアウト部分です:

GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
this.setLayout(gridBag);
c.fill = GridBagConstraints.BOTH;

c.gridwidth = 1;
c.gridheight = 2;
c.weighty = PANEL_HEIGHT;
gridbag.setConstraints(labelA, c);
this.add(labelA);

gridbag.setConstraints(labelB, c);
this.add(labelB);

c.gridheight = 1;
c.weighty = TOPROW_HEIGHT;
gridbag.setConstraints(labelC, c);
this.add(labelC);

c.gridheight = 2;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weighty = PANEL_HEIGHT;
gridbag.setConstraints(labelD, c);
this.add(labelD);

c.gridheight = 1;
c.gridwidth = 1;
c.weighty = BOTROW_HEIGHT;
gridbag.setConstraints(labelE, c);
this.add(labelE);

this.validate();

私が欠けているものについてのアイデアはありますか?

4

4 に答える 4

1

gridX と gridY を設定する必要があります。

GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
this.setLayout(gridBag);
c.fill = GridBagConstraints.BOTH;

c.gridwidth = 1;
c.gridheight = 2;
c.gridx = 0;
c.gridy = 0;
c.weighty = PANEL_HEIGHT;
gridbag.setConstraints(labelA, c);
this.add(labelA);

c.gridx = 1;
c.gridy = 0;
gridbag.setConstraints(labelB, c);
this.add(labelB);

c.gridx = 2;
c.gridy = 0;
c.gridheight = 1;
c.weighty = TOPROW_HEIGHT;
gridbag.setConstraints(labelC, c);
this.add(labelC);

c.gridx = 3;
c.gridy = 0;
c.gridheight = 2;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weighty = PANEL_HEIGHT;
gridbag.setConstraints(labelD, c);
this.add(labelD);

c.gridx = 2;
c.gridy = 1;
c.gridheight = 1;
c.gridwidth = 1;
c.weighty = BOTROW_HEIGHT;
gridbag.setConstraints(labelE, c);
this.add(labelE);

this.validate();

それが役立つことを願っています。

于 2010-10-01T20:51:09.747 に答える
1

とを使用gridxgridyて、グリッド上の位置を選択できます。

    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints c = new GridBagConstraints();

    this.setLayout(gridbag);

    c.fill = GridBagConstraints.BOTH;

    c.gridwidth = 1;
    c.gridheight = 2;
    c.gridx = 0;
    c.gridy = 0;
    c.weighty = PANEL_HEIGHT;
    gridbag.setConstraints(labelA, c);
    this.add(labelA);

    c.gridx = 1;
    c.gridy = 0;
    gridbag.setConstraints(labelB, c);
    this.add(labelB);

    c.gridx = 2;
    c.gridy = 0;
    c.gridheight = 1;
    c.weighty = TOPROW_HEIGHT;
    gridbag.setConstraints(labelC, c);
    this.add(labelC);


    c.gridx = 3;
    c.gridy = 0;
    c.gridheight = 2;
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.weighty = PANEL_HEIGHT;
    gridbag.setConstraints(labelD, c);
    this.add(labelD);

    c.gridx = 2;
    c.gridy = 1;
    c.fill = GridBagConstraints.VERTICAL;
    c.gridheight = 1;
    c.gridwidth = 1;
    c.weighty = BOTROW_HEIGHT;
    gridbag.setConstraints(labelE, c);
    this.add(labelE);

    this.validate();
于 2010-10-01T20:51:10.070 に答える
0

私の提案は、GridBaglayout を使用せずに上記を実行できることです。これにより、多くの時間を節約し、行数を減らすことができます。特定の問題については、単純なグリッド レイアウトを使用して目的を達成できます。

サイズ 1x4 の GridLayout を 1 つ作成します。3 番目の列には、サイズ 2x1 の別の GridLayout を使用できます。それらをすべて配置すれば、あなたが望むものを達成するはずです.

http://img823.imageshack.us/img823/5643/screenshot20101002at225.png

import java.awt.Component;
import java.awt.GridLayout;

import javax.swing.*;

public class LayoutTest extends JFrame {

    public LayoutTest(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setSize(300,75);
        this.add(getCustomPanel());
        this.setVisible(true);
    }

    private Component getCustomPanel() {
        JPanel pnl = new JPanel();
        GridLayout gridLayout = new GridLayout(1,4);
        pnl.setLayout(gridLayout);

        JPanel subPanel = new JPanel();
        GridLayout subLayout = new GridLayout(2,1);
        subPanel.setLayout(subLayout);

        subPanel.add(new JLabel("labelC"));
        subPanel.add(new JLabel("labelE"));

        pnl.add(new JLabel("labelA"));
        pnl.add(new JLabel("labelB"));
        pnl.add(subPanel);
        pnl.add(new JLabel("labelD"));

        return pnl;
    }

    public static void main(String[] args) {
        new LayoutTest();
    }
}
于 2010-10-01T20:46:44.747 に答える
0

この問題を (GridBag を使用して) 解決する最も簡単な方法は、JPanel 内に labelC と labelE を配置することです。

これを解決するより難しい方法は、gridx、gridy、および gridheight 制約を使用することです。だから、あなたは持っているでしょう

+---------------+--------------+----------+----------+
|  gridy=0      | gridy=0      |  gridy=0 |  gridy=0 |
|               |              |  gridx=2 |  gridx=3 |
|  gridx=0      | gridx=1      |----------|          |
|  gridheight=2 | gridheight=2 |  gridy=1 |          |        
|               |              |  gridx=2 |          |
+---------------+--------------+----------+----------+
于 2010-10-01T20:55:13.020 に答える