如何在GridLayout中调整JComponents的大小?

时间:2016-08-30 18:05:14

标签: java swing

我是Java编程的新手。你能帮我看看我的第一个应用程序(这是一个简单的计算器)的布局吗? 这是我写的代码:

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

class InputPad extends JFrame {

    private JLabel statusLabel;
    private JTextArea expTextArea;

    InputPad() {
        prepareGUI();
    }

    private void prepareGUI(){
        JFrame mainFrame = new JFrame("My Calculator");
        mainFrame.setSize(450,450);
        mainFrame.setLayout(new GridLayout(3,2));
        mainFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent){
                System.exit(0);
            }
        });

        JLabel headerLabel = new JLabel("Put your expression here:", JLabel.CENTER);
        statusLabel = new JLabel("",JLabel.CENTER);
        expTextArea = new JTextArea("1+(2^3*4)");

        //Digits Panel
        JPanel digitPanel = new JPanel();
        GroupLayout layoutDigits = new GroupLayout(digitPanel);
        digitPanel.setLayout(layoutDigits);
        layoutDigits.setAutoCreateGaps(true);
        layoutDigits.setAutoCreateContainerGaps(true);

        //Operators Panel
        JPanel operatorPanel = new JPanel();
        GroupLayout layoutOperators = new GroupLayout(operatorPanel);
        operatorPanel.setLayout(layoutOperators);
        layoutOperators.setAutoCreateGaps(true);
        layoutOperators.setAutoCreateContainerGaps(true);


        JButton[] numButtons= new JButton[10];

        int i;
        for (i=0;i<10;i++){
            numButtons[i] = new JButton(Integer.toString(i));
            numButtons[i].addActionListener(e -> {
//            TODO
            });
        }

        JButton bEquals = new JButton("=");
        bEquals.addActionListener(e -> {
//            TODO
        });

        JButton bPlus = new JButton("+");
        bPlus.addActionListener(e -> {
//            TODO
        });
        JButton bMinus = new JButton("-");
        bMinus.addActionListener(e -> {
//            TODO
        });
        JButton bMultiply = new JButton("*");
        bMultiply.addActionListener(e -> {
//            TODO
        });
        JButton bDivide = new JButton("/");
        bDivide.addActionListener(e -> {
//            TODO
        });
        JButton bLeftParenthesis = new JButton("(");
        bLeftParenthesis.addActionListener(e -> {
//            TODO
        });
        JButton bRightParenthesis = new JButton(")");
        bRightParenthesis.addActionListener(e -> {
//            TODO
        });
        JButton bPower = new JButton("^");
        bPower.addActionListener(e -> {
//            TODO
        });
        JButton bDel = new JButton("←");
        bDel.addActionListener(e -> {
//            TODO
        });


        layoutDigits.setHorizontalGroup(
                layoutDigits.createSequentialGroup()
                        .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.LEADING)
                                .addComponent(numButtons[7])
                                .addComponent(numButtons[4])
                                .addComponent(numButtons[1])
                                .addComponent(numButtons[0]))
                        .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.LEADING)
                                .addComponent(numButtons[8])
                                .addComponent(numButtons[5])
                                .addComponent(numButtons[2])
                                .addComponent(bEquals))
                        .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.LEADING)
                                .addComponent(numButtons[9])
                                .addComponent(numButtons[6])
                                .addComponent(numButtons[3]))
        );
        layoutDigits.setVerticalGroup(
                layoutDigits.createSequentialGroup()
                        .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                .addComponent(numButtons[7])
                                .addComponent(numButtons[8])
                                .addComponent(numButtons[9]))
                        .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                .addComponent(numButtons[4])
                                .addComponent(numButtons[5])
                                .addComponent(numButtons[6]))
                        .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                .addComponent(numButtons[1])
                                .addComponent(numButtons[2])
                                .addComponent(numButtons[3]))
                        .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                .addComponent(numButtons[0])
                                .addComponent(bEquals))
        );

        layoutOperators.setHorizontalGroup(
                layoutOperators.createSequentialGroup()
                        .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.LEADING)
                                .addComponent(bPlus)
                                .addComponent(bMinus)
                                .addComponent(bLeftParenthesis)
                                .addComponent(bPower))
                        .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.LEADING)
                                .addComponent(bMultiply)
                                .addComponent(bDivide)
                                .addComponent(bRightParenthesis)
                                .addComponent(bDel))
        );
        layoutOperators.setVerticalGroup(
                layoutOperators.createSequentialGroup()
                        .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                .addComponent(bPlus)
                                .addComponent(bMultiply))
                        .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                .addComponent(bMinus)
                                .addComponent(bDivide))
                        .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                .addComponent(bLeftParenthesis)
                                .addComponent(bRightParenthesis))
                        .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                .addComponent(bPower)
                                .addComponent(bDel))
        );


        mainFrame.add(headerLabel);
        mainFrame.add(expTextArea);
        mainFrame.add(digitPanel);
        mainFrame.add(operatorPanel);
        mainFrame.add(statusLabel);
        mainFrame.setVisible(true);
    }

}

我为我的JFrame尝试了GridLayout,但除了主JFrame之外,我无法调整大小和我的JComponent。即使我不能将两个JPanels(并排)放在GridLayout的一个单元格中,或者将JLabel扩展为GridLayout的两个单元格。

这就是我得到的:

what I got

这就是我想要的: what I want

2 个答案:

答案 0 :(得分:2)

让我们从使用Layout Managers <{3}}

的链接开始
  

GridLayout简单地使一组组件的大小相等,并以请求的行数和列数显示它们

所以,这不是你想要的,但如果你阅读了GridLayout部分,它会说:

  

GridBagLayout是一个复杂,灵活的布局管理器。它通过将组件放置在单元格网格中来对齐组件,从而允许组件跨越多个单元格。网格中的行可以具有不同的高度,并且网格列可以具有不同的宽度。

我们可以将它们与GridBagLayout结合使用,您将获得与您要实现的目标类似的输出:

BoxLayout

请注意:

在发布代码之前,请注意以下提示:

  1. 您正在扩展JFrame并且在创建JFrame对象的同时,不鼓励这样做,删除其中一个,在这种情况下,当您使用对象,这是建议的事情,只需从您的班级中删除extends JFrame。如果您确实需要扩展某些内容,请不要扩展JFrame而应扩展JPanel

  2. 将您的程序放在EDT中,就像我在main()方法中所做的那样

  3. 请勿使用System.exit(0);而是拨打setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),如上面代码所示

  4. 现在代码

    import java.awt.BorderLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.GridLayout;
    import java.awt.Insets;
    
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.SwingUtilities;
    
    public class CalculatorExample {
        private JFrame frame;
        private JTextArea area;
        private JButton[][] digitsButtons, symbolsButtons;
        private String[][] digitsText = {{"7", "8", "9"}, {"4", "5", "6"}, {"1", "2", "3"}, {"0", "="}}; //Looks strange but this will make the button adding easier
        private String[][] symbolsText = {{"+", "*"}, {"-", "/"}, {"(", ")"}, {"^", "←"}};
        private JPanel buttonsPane, areaAndResultsPane, digitsPane, symbolsPane;
        private JLabel label;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new CalculatorExample().createAndShowGui();
                }
            });
        }
    
        public void createAndShowGui() {
            frame = new JFrame("Calculator Example");
            area = new JTextArea();
            area.setRows(5);
            area.setColumns(20);
            label = new JLabel("Results go here");
            digitsButtons = new JButton [4][3];
            symbolsButtons= new JButton [4][2];
            areaAndResultsPane = new JPanel();
            areaAndResultsPane.setLayout(new BoxLayout(areaAndResultsPane, BoxLayout.PAGE_AXIS));
    
            buttonsPane = new JPanel();
            buttonsPane.setLayout(new GridLayout(1, 2, 10, 10));
    
            digitsPane = new JPanel();
            digitsPane.setLayout(new GridBagLayout());
    
            symbolsPane = new JPanel();
            symbolsPane.setLayout(new GridLayout(4, 2));
    
            GridBagConstraints c = new GridBagConstraints();
    
            for (int i = 0; i < digitsText.length; i++) {
                for (int j = 0; j < digitsText[i].length; j++) {
                    digitsButtons[i][j] = new JButton(digitsText[i][j]);
                }
            }
    
            for (int i = 0; i < symbolsText.length; i++) {
                for (int j = 0; j < symbolsText[i].length; j++) {
                    symbolsButtons[i][j] = new JButton(symbolsText[i][j]);
                }
            }
    
            areaAndResultsPane.add(area);
            areaAndResultsPane.add(label);
    
            boolean shouldBreak = false;
            for (int i = 0; i < digitsButtons.length; i++) {
                for (int j = 0; j < digitsButtons[i].length; j++) {
                    c.gridx = j;
                    c.gridy = i;
                    c.fill = GridBagConstraints.HORIZONTAL;
                    c.weightx = 0.5;
                    if (i == 3) {
                        if (j == 1) {
                            c.gridwidth = 2; //This makes the "=" button larger
                            shouldBreak = true;
                        }
                    }
                    digitsPane.add(digitsButtons[i][j], c);
                    if (shouldBreak) {
                        break;
                    }
                }
            }
    
            for (int i = 0; i < symbolsButtons.length; i++) {
                for (int j = 0; j < symbolsButtons[i].length; j++) {
                    symbolsPane.add(symbolsButtons[i][j]);
                }
            }
    
            frame.add(areaAndResultsPane, BorderLayout.NORTH);
            buttonsPane.add(digitsPane);
            buttonsPane.add(symbolsPane);
    
            frame.add(buttonsPane, BorderLayout.CENTER);
    
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    

    这是嵌套JPanels,每个都有不同的布局,我希望它可以帮助你从这里继续。

答案 1 :(得分:0)

根据Oracle文档:

  

每个组件占用其单元格中的所有可用空间,每个单元格的大小完全相同。

很遗憾,你无法调整GridLayout中任何组件的大小

您可以使用GridBagLayout。理解它有点复杂,但提供更多功能。我让你用文档做一些测试,以便与它取得联系!