如何控制面板的大小

时间:2015-01-02 01:25:04

标签: java swing jpanel

我正在学习swing gui,当我使用以下代码时,我得到了这个结果: -

What I get

我使用的代码: -

private void initUI() {
        JTextArea visualize=new JTextArea();
        visualize.setEditable(false);

        //DEFINE BUTTONS....

        JButton[] buttons1={addition,subtraction,division,multiplication};
        JButton [] buttons2={expr,date,conversion};

        JPanel numerical=new JPanel(new FlowLayout());
        numerical.setPreferredSize(new Dimension(350, 50));
        for(int i=0;i<buttons1.length;i++){
            numerical.add(buttons1[i]);
        }
        numerical.setBorder(new TitledBorder("Numerical Operations"));

        JPanel nonnum=new JPanel(new FlowLayout());
        nonnum.setPreferredSize(new Dimension(500, 50));
        for(int i=0;i<buttons2.length;i++){
            nonnum.add(buttons2[i]);
        }
        nonnum.setBorder(new TitledBorder("Non-numerical Operations"));

        JPanel operations = new JPanel(new BorderLayout(2,2));
        operations.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        operations.setSize(800, 100);
        operations.add(numerical,BorderLayout.WEST);
        operations.add(nonnum,BorderLayout.EAST);

        JTable sheet = new JTable(10,5);



        add(visualize, BorderLayout.NORTH);
        add(sheet,BorderLayout.SOUTH);
        add(operations,BorderLayout.CENTER);
        pack();
        setSize(1000, 700);
        setTitle("Spreadsheet Application");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

但我真正想要的是: - What I want

我的问题: -

  1. 为什么操作面板太长?
  2. 如何更改它的高度?
  3. 没有&#34; operations.setSize(..)&#34;工作?

3 个答案:

答案 0 :(得分:2)

尝试使用GroupLayout。 我也是新手摇摆gui并遇到类似问题 - GroupLayout救了一天

    JPanel complete=new JPanel();
    GroupLayout gl=new GroupLayout(complete);
    complete.setLayout(gl);
    gl.setAutoCreateContainerGaps(true);

    gl.setHorizontalGroup(gl.createParallelGroup() //this is parallel bcz you need components vertically
            .addComponent(visualize)       //you MUST add components to both horizontal and vertical groups
            .addComponent(operations)
            .addComponent(sheet)
    );

    gl.setVerticalGroup(gl.createSequentialGroup() //NOTE that this is sequential
            .addComponent(visualize)
            .addComponent(operations)
            .addGap(50)        //you can add gaps if you want
            .addComponent(sheet)
    );

    add(complete);

答案 1 :(得分:1)

因为BorderLayout的工作原理,请仔细查看How to Use BorderLayoutCENTRE位置将占据框架的所有剩余空间,NORTHSOUTH位置将尝试并尊重组件的首选大小。

您可以使用GridBagLayout,这样您就可以更好地控制布局或使用一系列复合布局。

像...一样的东西。

setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.BOTH;

add(visualize, gbc);
add(operations, gbc);
gbc.gridy = 1;
add(sheet, gbc);

通常不鼓励从JFrame这样的顶级容器扩展,而是应该使用类似JPanel的内容来定义UI,然后将它们添加到所需的容器中。这增加了可重用性并使其更容易在不同的容器上使用

您可能还想看看How to Use Scroll Panes

答案 2 :(得分:1)

我们中的一些人发现GridBagLayout是一种皇室般的痛苦,你可能不必用它来做你想做的事。

布局管理器背后的想法是让布局管理器控制其组件的大小和位置,以便您不必使用它们。 MP是对的,GridBag允许你进行很多控制,但这也意味着你必须要做很多事情才能让它做你想做的事。

所以,另一种方法是:制作一个JPanel来保存visualizeoperations面板;给这个新面板一个带有Y_AXIS方向的BoxLayout,然后按照你希望它们从上到下的顺序添加它们。

然后将sheet放在JFrame的BorderLayout.CENTER中。事实上,我认为你会想要听取MP的建议并通过关于JScrollPane的教程;我记得最好,你创建面板,然后用面板作为构造参数创建JScrollPane实例,然后将scrollpane实例添加到JFrame(在你的情况下在CENTER中)。

当处于中心位置时,它会随着用户更改窗口大小而扩展和收缩。

祝你好运。 Swing需要一些时间来适应。