关于GUI的布局

时间:2013-12-23 10:59:30

标签: java swing layout

我正在处理一个程序。它的GUI有两个主要部分,JFrame的左边和JFrame的右边。 (目前右半部分是空白的,因为我还没有开始研究它。)

左边部分看起来不太好。所有按钮和文本字段都被拉伸。我希望它们具有标准按钮的高度,类似于本网站上的按钮。 (你知道,标准的Windows按钮)。

我该怎么做?

(我不想简单地打包()整个事情,因为窗口的右半部分将有一个大的方形JPanel,所以pack()ing意味着窗口仍然是方形和左半边的按钮仍然会上下拉伸。)

这是一张图片:

enter image description here

到目前为止,这里是代码:

import javax.swing.*;
import java.awt.*;
import java.awt.Event.*;

public class GUI extends JFrame {

    JButton rect,oval,tri,free,addPoint;
    JLabel xLabel,yLabel;
    JTextField xTextField,yTextField;
    JPanel leftPanel,rightPanel,optionsPanel,pointsPanel;

    public GUI(){
        initUI();
    }

    private void initUI(){

        setLayout(new GridLayout(1,2,5,5));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Graphics Generator");
        setSize(500,500);

        rect = new JButton("Rectangle");
        oval = new JButton("Oval");
        tri = new JButton("Triangle");
        free = new JButton("Free Shape");
        addPoint = new JButton("Add point");

        xLabel = new JLabel("X: ");
        yLabel = new JLabel("Y: ");

        xTextField = new JTextField(2);
        yTextField = new JTextField(2);

        leftPanel = new JPanel();
        rightPanel = new JPanel();
        optionsPanel = new JPanel();
        pointsPanel = new JPanel();

        add(leftPanel);
        add(rightPanel);

        leftPanel.setLayout(new GridLayout(2,1,5,5));
        leftPanel.add(optionsPanel);

        optionsPanel.setLayout(new GridLayout(1,4,2,2));

        optionsPanel.add(rect);
        optionsPanel.add(oval);
        optionsPanel.add(tri);
        optionsPanel.add(free);

        leftPanel.add(pointsPanel);

        pointsPanel.setLayout(new GridLayout(1,5,2,2));

        pointsPanel.add(xLabel);
        pointsPanel.add(xTextField);
        pointsPanel.add(yLabel);
        pointsPanel.add(yTextField);
        pointsPanel.add(addPoint);

        setVisible(true);

    }

    public static void main(String[] args) {

        GUI gui = new GUI();

    }

}

4 个答案:

答案 0 :(得分:0)

有关网格布局

的更多信息,请浏览以下链接

How to Use GridLayout

在java swing中尝试使用不同的布局

A Visual Guide to Layout Managers

答案 1 :(得分:0)

Try this


import javax.swing.*;
import java.awt.*;
import java.awt.Event.*;

public class GUI extends JFrame {

    JButton rect,oval,tri,free,addPoint;
    JLabel xLabel,yLabel;
    JTextField xTextField,yTextField;
    JPanel leftPanel,rightPanel,optionsPanel,pointsPanel;

    public GUI(){
        initUI();
    }

    private void initUI(){

        setLayout(new GridLayout(1,2,5,5));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Graphics Generator");
        setSize(500,500);

        rect = new JButton("Rectangle");
        oval = new JButton("Oval");
        tri = new JButton("Triangle");
        free = new JButton("Free Shape");
        addPoint = new JButton("Add point");

        JPnel p=new JPanel();
p.add(rect);
p.add(oval);
p.add(tri);
p.add(free);
p.add(addPoint);
        xLabel = new JLabel("X: ");
        yLabel = new JLabel("Y: ");

        xTextField = new JTextField(2);
        yTextField = new JTextField(2);

        leftPanel = new JPanel();
        rightPanel = new JPanel();
        optionsPanel = new JPanel();
        pointsPanel = new JPanel();

        add(leftPanel);
        add(rightPanel);

        leftPanel.setLayout(new GridLayout(2,1,5,5));
        leftPanel.add(optionsPanel);

        optionsPanel.setLayout(new GridLayout(1,4,2,2));

        optionsPanel.add(p);
        //optionsPanel.add(oval);
        //optionsPanel.add(tri);
        //optionsPanel.add(free);

        leftPanel.add(pointsPanel);

        pointsPanel.setLayout(new GridLayout(1,5,2,2));

        pointsPanel.add(xLabel);
        pointsPanel.add(xTextField);
        pointsPanel.add(yLabel);
        pointsPanel.add(yTextField);
        pointsPanel.add(addPoint);

        setVisible(true);

    }

    public static void main(String[] args) {

        GUI gui = new GUI();

    }

}


Like this for JLabels and JTextFields

答案 2 :(得分:0)

请尝试FlowLayout它适合您的要求。

只需更改setLayout(new FlowLayout());

即可

输出:

Output

答案 3 :(得分:0)

您有这种效果,因为您使用GridLayout,它将组件调整为整个单元格(垂直/水平)。您需要使用其他LayoutManager或布局组合。

例如,我已使用GridBagLayout更改了代码:

 private void initUI(){

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setTitle("Graphics Generator");
    setLayout(new GridBagLayout());

    rect = new JButton("Rectangle");
    oval = new JButton("Oval");
    tri = new JButton("Triangle");
    free = new JButton("Free Shape");
    addPoint = new JButton("Add point");

    xLabel = new JLabel("X: ");
    yLabel = new JLabel("Y: ");

    xTextField = new JTextField(2);
    yTextField = new JTextField(2);

    leftPanel = new JPanel();
    leftPanel.setBorder(BorderFactory.createLineBorder(Color.RED));
    rightPanel = new JPanel();
    rightPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
    optionsPanel = new JPanel(new GridBagLayout());
    pointsPanel = new JPanel(new GridBagLayout());

    GridBagConstraints cMain = new GridBagConstraints();
    cMain.insets = new Insets(5, 5, 5, 5);
    cMain.gridx = 0;
    cMain.gridy = 0;
    cMain.anchor = GridBagConstraints.NORTHWEST;
    add(leftPanel,cMain);
    cMain.fill = GridBagConstraints.BOTH;
    cMain.gridx++;
    cMain.weighty = 1;
    cMain.weightx = 1;
    add(rightPanel,cMain);

    leftPanel.setLayout(new GridBagLayout());

    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(5, 5, 5, 5);
    c.gridx = 0;
    c.gridy = 0;
    c.anchor = GridBagConstraints.WEST;
    leftPanel.add(optionsPanel,c);
    c.gridy++;
    leftPanel.add(pointsPanel,c);

    c.gridy = 0;
    optionsPanel.add(rect,c);
    c.gridx++;
    optionsPanel.add(oval,c);
    c.gridx++;
    optionsPanel.add(tri,c);
    c.gridx++;
    optionsPanel.add(free,c);

    c.gridx = 0;
    c.gridy = 1;
    pointsPanel.add(xLabel,c);
    c.gridx++;
    pointsPanel.add(xTextField,c);
    c.gridx++;
    pointsPanel.add(yLabel,c);
    c.gridx++;
    pointsPanel.add(yTextField,c);
    c.gridx++;
    pointsPanel.add(addPoint,c);

    setSize(500,500);
    setVisible(true);
}

enter image description here