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

我是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 { // 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之外,我无法resize和我的JComponent。 即使我不能将两个JPanels(并排)放在GridLayout的一个单元格中,或者将JLabel扩展为GridLayout的两个单元格。

这就是我得到的:

我得到了什么

这就是我想要的: 我想要的是

让我们从布局管理器的使用开始,从GridLayout部分的链接开始

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

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

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

我们可以将它们与BoxLayout结合起来,您将获得与您想要实现的类似的输出:

在此处输入图像描述


请注意:

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

  1. 您正在扩展JFrame并且在创建JFrame对象的同时,不鼓励这样做,删除其中一个,在这种情况下,当您使用该对象时,这是建议的事情,只需删除extends JFrame你class上的extends JFrame 。 如果你真的需要扩展一些东西,不要扩展JFrame而是扩展JPanel

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

  3. 不要使用System.exit(0); 而是调用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ,如上面的代码所示


而现在的代码

 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 ,每个都有不同的布局,我希望它可以帮助你从这里继续。

根据Oracle文档:

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

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

您可以改为使用GridBagLayout 。 理解它有点复杂但提供更多function。 我让你用文档做一些测试来与它联系!