在GridBagLayout中以固定宽度显示JPanel上的JLabel

时间:2016-01-31 15:49:38

标签: java swing jpanel jlabel gridbaglayout

我想显示一个带有两个JPanel的JFrame。为简单起见,我实现了一个"占位符" JPFnel在JFrame的右半部分。 我想在JFrame的左侧实现一个JPanel,即

a)水平方向不可调整大小(应具有固定宽度)。

b)左侧JPanel的类应该有一个方法将JLabel尽可能地放在JPanel上(第一个JLabel尽可能远,第二个JLabel在第一个JLabel下,第三个在第二个JLabel下等等) ),最好是在左侧JPanel的中心。

我的代码是:

public class Test extends JPanel {

     public Test() {
        this.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        this.setBackground(Color.WHITE);
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.weighty = 0;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200,200);
    }

    public void addEntry() {
        JLabel label = new JLabel();
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.weighty = 1;
        gbc.weightx = 1;

        gbc.fill = GridBagConstraints.HORIZONTAL;

        label.setText("Label test");
        this.add(label, gbc);
        this.validate();
    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setLayout(new BorderLayout(2,1));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Test test = new Test();

    JPanel placeholder = new JPanel();
    placeholder.setPreferredSize(new Dimension(200,200));
    placeholder.setBackground(Color.BLACK);

    frame.add(test, BorderLayout.LINE_START);
    frame.add(placeholder, BorderLayout.CENTER);

    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    test.addEntry();
    test.addEntry();
}

状态:

目前左侧JPanel的固定宽度应该是固定宽度,但JLabel在JPanel上以垂直方向添加,也没有放在JPanel的中心。

截图:

http://imgur.com/tvwn7Mc

enter image description here

编辑: 使用mKorbel的建议尝试BoxLayout:

public class Test extends JPanel {
public Test() {
    this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(200,200);
}

public void addEntry() {
    JLabel label = new JLabel();
    label.setText("Label test");
    label.setAlignmentX(Component.CENTER_ALIGNMENT);
    this.add(label);
    this.revalidate();
}

}

1 个答案:

答案 0 :(得分:2)

您的addEntry()方法使用相同的约束,因此您无法获得所需的结果。

您需要创建一个实例变量,假设“row”最初设置为值0.然后将组件添加到面板中,x值为0,y值为“row”。在方法结束时,您将行递增1,以便下次调用方法时,y值将为1,这将为您提供垂直布局。

或另一种选择是使用垂直BoxLayout。那你就不用担心网格位置了。每次添加组件时,都会垂直添加。阅读How to Use Box Layout上Swing教程中的部分,了解更多信息和示例。