Java 使用LayoutManager创建特定的计算器

Java 使用LayoutManager创建特定的计算器,java,swing,user-interface,layout-manager,Java,Swing,User Interface,Layout Manager,我尝试创建此计算器: 我想使用LayoutManager添加按钮和文本框,但我不明白如何 我有另一个方法获取字符串并进行计算 Calculator.java import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.ev

我尝试创建此计算器:

我想使用LayoutManager添加按钮和文本框,但我不明白如何

我有另一个方法获取字符串并进行计算

Calculator.java

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.LayoutManager;
import java.awt.Container;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.Insets;

import javax.swing.SpringLayout;
import javax.swing.SwingUtilities;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
import javax.swing.BorderFactory;
import javax.swing.WindowConstants;

public class Calculator extends JFrame
{
    protected JTextField display;

    protected JButton b1 = new JButton("1");
    protected JButton b2 = new JButton("2");
    protected JButton b3 = new JButton("3");
    protected JButton b4 = new JButton("4");
    protected JButton b5 = new JButton("5");
    protected JButton b6 = new JButton("6");
    protected JButton b7 = new JButton("7");
    protected JButton b8 = new JButton("8");
    protected JButton b9 = new JButton("9");
    protected JButton b0 = new JButton("0");

    protected JButton addition = new JButton("+");
    protected JButton subtraction = new JButton("-");
    protected JButton multiplication = new JButton("*");
    protected JButton division = new JButton("/");
    protected JButton result = new JButton("=");
    protected JButton allClear = new JButton("C");
    protected JButton decimalPoint = new JButton(".");

    public Calculator()
    {
        super("Calculator");
        Handler handler = new Handler();

        allClear.addActionListener(handler);
        addition.addActionListener(handler);
        subtraction.addActionListener(handler);
        multiplication.addActionListener(handler);
        division.addActionListener(handler);
        result.addActionListener(handler);
        decimalPoint.addActionListener(handler);

        b0.addActionListener(handler);
        b1.addActionListener(handler);
        b2.addActionListener(handler);
        b3.addActionListener(handler);
        b4.addActionListener(handler);
        b5.addActionListener(handler);
        b6.addActionListener(handler);
        b7.addActionListener(handler);
        b8.addActionListener(handler);
        b9.addActionListener(handler);

        addition.setToolTipText("Addition");
        subtraction.setToolTipText("Subtraction");
        multiplication.setToolTipText("Multiplication");
        division.setToolTipText("Division");
        result.setToolTipText("Result");
        allClear.setToolTipText("All Clear");
        decimalPoint.setToolTipText("Decimal point");

        display = new JTextField(10);
        display.setBorder(BorderFactory.createLineBorder(Color.CYAN));

        // Set a panel's layout manager using the JPanel constructor

        JPanel mainPanel = new JPanel(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();
        c.gridy = 0;
        c.gridwidth = 3;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(display, c);

        c = new GridBagConstraints();
        c.gridy = 0;
        c.gridwidth = 1;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(allClear, c);

        c = new GridBagConstraints();
        c.gridy = 1;
        c.gridwidth = 1;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b1, c);

        c = new GridBagConstraints();
        c.gridy = 1;
        c.gridwidth = 1;;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b2, c);

        c = new GridBagConstraints();
        c.gridy = 1;
        c.gridwidth = 1;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b3, c);

        c = new GridBagConstraints();
        c.gridy = 1;
        c.gridwidth = 1;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(division, c);

        c = new GridBagConstraints();
        c.gridy = 2;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b4, c);

        c = new GridBagConstraints();
        c.gridy = 2;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b5, c);

        c = new GridBagConstraints();
        c.gridy = 2;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b6, c);
        add(mainPanel);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();

        c = new GridBagConstraints();
        c.gridy = 2;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(multiplication, c);

        c = new GridBagConstraints();
        c.gridy = 3;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b7, c);

        c = new GridBagConstraints();
        c.gridy = 3;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b8, c);

        c = new GridBagConstraints();
        c.gridy = 3;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b9, c);

        c = new GridBagConstraints();
        c.gridy = 3;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(subtraction, c);

        c = new GridBagConstraints();
        c.gridy = 4;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b0, c);

        c = new GridBagConstraints();
        c.gridy = 4;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(decimalPoint, c);

        c = new GridBagConstraints();
        c.gridy = 4;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(result, c);

        c = new GridBagConstraints();
        c.gridy = 4;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(addition, c);

    }

    public Dimension getPreferredSize()
    {
        return new Dimension(250, 300);
    }

    protected class Handler implements ActionListener
    {
        String str;

        public void actionPerformed(ActionEvent e)
        {
            if (e.getSource() == b1)
                display.setText(display.getText().concat("1"));

            if (e.getSource() == b2)
                display.setText(display.getText().concat("2"));

            if (e.getSource() == b3)
                display.setText(display.getText().concat("3"));

            if (e.getSource() == b4)
                display.setText(display.getText().concat("4"));

            if (e.getSource() == b5)
                display.setText(display.getText().concat("5"));

            if (e.getSource() == b6)
                display.setText(display.getText().concat("6"));

            if (e.getSource() == b7)
                display.setText(display.getText().concat("7"));

            if (e.getSource() == b8)
                display.setText(display.getText().concat("8"));

            if (e.getSource() == b9)
                display.setText(display.getText().concat("9"));

            if (e.getSource() == b0)
                display.setText(display.getText().concat("0"));

            if (e.getSource() == decimalPoint)
                display.setText(display.getText().concat("."));

            if (e.getSource() == addition)
                display.setText(display.getText().concat("+"));

            if (e.getSource() == subtraction)
                display.setText(display.getText().concat("-"));

            if (e.getSource() == multiplication)
                display.setText(display.getText().concat("*"));

            if (e.getSource() == division)
                display.setText(display.getText().concat("/"));

            if (e.getSource() == allClear)
                display.setText("");

            if (e.getSource() == result)
                str = display.getText();
        }
    }
}
public class CalculatorTest
{
    public static void main(String[] args)
    {
        java.awt.EventQueue.invokeLater(() -> {
        new Calculator().setVisible(true);
    });
    }
}
CalculatorTest.java

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.LayoutManager;
import java.awt.Container;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.Insets;

import javax.swing.SpringLayout;
import javax.swing.SwingUtilities;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
import javax.swing.BorderFactory;
import javax.swing.WindowConstants;

public class Calculator extends JFrame
{
    protected JTextField display;

    protected JButton b1 = new JButton("1");
    protected JButton b2 = new JButton("2");
    protected JButton b3 = new JButton("3");
    protected JButton b4 = new JButton("4");
    protected JButton b5 = new JButton("5");
    protected JButton b6 = new JButton("6");
    protected JButton b7 = new JButton("7");
    protected JButton b8 = new JButton("8");
    protected JButton b9 = new JButton("9");
    protected JButton b0 = new JButton("0");

    protected JButton addition = new JButton("+");
    protected JButton subtraction = new JButton("-");
    protected JButton multiplication = new JButton("*");
    protected JButton division = new JButton("/");
    protected JButton result = new JButton("=");
    protected JButton allClear = new JButton("C");
    protected JButton decimalPoint = new JButton(".");

    public Calculator()
    {
        super("Calculator");
        Handler handler = new Handler();

        allClear.addActionListener(handler);
        addition.addActionListener(handler);
        subtraction.addActionListener(handler);
        multiplication.addActionListener(handler);
        division.addActionListener(handler);
        result.addActionListener(handler);
        decimalPoint.addActionListener(handler);

        b0.addActionListener(handler);
        b1.addActionListener(handler);
        b2.addActionListener(handler);
        b3.addActionListener(handler);
        b4.addActionListener(handler);
        b5.addActionListener(handler);
        b6.addActionListener(handler);
        b7.addActionListener(handler);
        b8.addActionListener(handler);
        b9.addActionListener(handler);

        addition.setToolTipText("Addition");
        subtraction.setToolTipText("Subtraction");
        multiplication.setToolTipText("Multiplication");
        division.setToolTipText("Division");
        result.setToolTipText("Result");
        allClear.setToolTipText("All Clear");
        decimalPoint.setToolTipText("Decimal point");

        display = new JTextField(10);
        display.setBorder(BorderFactory.createLineBorder(Color.CYAN));

        // Set a panel's layout manager using the JPanel constructor

        JPanel mainPanel = new JPanel(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();
        c.gridy = 0;
        c.gridwidth = 3;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(display, c);

        c = new GridBagConstraints();
        c.gridy = 0;
        c.gridwidth = 1;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(allClear, c);

        c = new GridBagConstraints();
        c.gridy = 1;
        c.gridwidth = 1;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b1, c);

        c = new GridBagConstraints();
        c.gridy = 1;
        c.gridwidth = 1;;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b2, c);

        c = new GridBagConstraints();
        c.gridy = 1;
        c.gridwidth = 1;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b3, c);

        c = new GridBagConstraints();
        c.gridy = 1;
        c.gridwidth = 1;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(division, c);

        c = new GridBagConstraints();
        c.gridy = 2;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b4, c);

        c = new GridBagConstraints();
        c.gridy = 2;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b5, c);

        c = new GridBagConstraints();
        c.gridy = 2;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b6, c);
        add(mainPanel);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();

        c = new GridBagConstraints();
        c.gridy = 2;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(multiplication, c);

        c = new GridBagConstraints();
        c.gridy = 3;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b7, c);

        c = new GridBagConstraints();
        c.gridy = 3;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b8, c);

        c = new GridBagConstraints();
        c.gridy = 3;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b9, c);

        c = new GridBagConstraints();
        c.gridy = 3;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(subtraction, c);

        c = new GridBagConstraints();
        c.gridy = 4;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(b0, c);

        c = new GridBagConstraints();
        c.gridy = 4;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(decimalPoint, c);

        c = new GridBagConstraints();
        c.gridy = 4;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(result, c);

        c = new GridBagConstraints();
        c.gridy = 4;
        c.insets = new Insets(5, 5, 5, 5);
        mainPanel.add(addition, c);

    }

    public Dimension getPreferredSize()
    {
        return new Dimension(250, 300);
    }

    protected class Handler implements ActionListener
    {
        String str;

        public void actionPerformed(ActionEvent e)
        {
            if (e.getSource() == b1)
                display.setText(display.getText().concat("1"));

            if (e.getSource() == b2)
                display.setText(display.getText().concat("2"));

            if (e.getSource() == b3)
                display.setText(display.getText().concat("3"));

            if (e.getSource() == b4)
                display.setText(display.getText().concat("4"));

            if (e.getSource() == b5)
                display.setText(display.getText().concat("5"));

            if (e.getSource() == b6)
                display.setText(display.getText().concat("6"));

            if (e.getSource() == b7)
                display.setText(display.getText().concat("7"));

            if (e.getSource() == b8)
                display.setText(display.getText().concat("8"));

            if (e.getSource() == b9)
                display.setText(display.getText().concat("9"));

            if (e.getSource() == b0)
                display.setText(display.getText().concat("0"));

            if (e.getSource() == decimalPoint)
                display.setText(display.getText().concat("."));

            if (e.getSource() == addition)
                display.setText(display.getText().concat("+"));

            if (e.getSource() == subtraction)
                display.setText(display.getText().concat("-"));

            if (e.getSource() == multiplication)
                display.setText(display.getText().concat("*"));

            if (e.getSource() == division)
                display.setText(display.getText().concat("/"));

            if (e.getSource() == allClear)
                display.setText("");

            if (e.getSource() == result)
                str = display.getText();
        }
    }
}
public class CalculatorTest
{
    public static void main(String[] args)
    {
        java.awt.EventQueue.invokeLater(() -> {
        new Calculator().setVisible(true);
    });
    }
}
我使用GridBagLayout更改代码,但我不明白这一点

到目前为止,我所做的更改是:如果我删除了Dimension getPreferredSize()方法并运行,那么计算器将以最小化大小显示,如果我按下窗口的最大化按钮,那么我将看到完整的计算器

如果使用这种方法,我可以得到所有的计算器,但体积很小

我想要一个更大的按钮和一个更大的布局,但我不知道如何做到这一点


为什么C按钮的高度大于文本框的高度?

a
GridBagLayout
将非常符合您的要求。每次使用此布局将对象添加到容器时,都会指定一组约束,用于定义要将其放置的位置

在下面的简单示例中,您可以看到我正在使用
新插入(5,5,5,5)
在组件之间添加一些空格,我通过将
fill
属性设置为
GridBagConstraints.HORIZONTAL
,确保它们将填充整个单元格

所有这些约束在本教程中都有很好的解释,这将告诉您如何使用此布局管理器

public class JavaDemo extends JFrame {

    public JavaDemo() {
        initComponents();
    }

    private void initComponents() {
        JPanel mainPanel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.gridx=0;
        c.gridy=0;
        c.gridwidth=2;
        c.weightx=1;
        c.fill=GridBagConstraints.HORIZONTAL;
        c.insets=new Insets(5,5,5,5);
        mainPanel.add(new JTextField(10), c);

        c = new GridBagConstraints();
        c.gridx=0;
        c.gridy=1;
        c.weightx=1;
        c.fill=GridBagConstraints.HORIZONTAL;
        c.insets=new Insets(5,5,5,5);
        mainPanel.add(new JButton("1"), c);

        c = new GridBagConstraints();
        c.gridx=1;
        c.gridy=1;
        c.weightx=1;
        c.fill=GridBagConstraints.HORIZONTAL;
        c.insets=new Insets(5,5,5,5);
        mainPanel.add(new JButton("2"), c);

        c = new GridBagConstraints();
        c.gridx=0;
        c.gridy=2;
        c.weightx=1;
        c.fill=GridBagConstraints.HORIZONTAL;
        c.insets=new Insets(5,5,5,5);
        mainPanel.add(new JButton("3"), c);

        c = new GridBagConstraints();
        c.gridx=1;
        c.gridy=2;
        c.weightx=1;
        c.fill=GridBagConstraints.HORIZONTAL;
        c.insets=new Insets(5,5,5,5);
        mainPanel.add(new JButton("4"), c);

        add(mainPanel);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
    }                     

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(() -> {
            new JavaDemo().setVisible(true);
        });
    }           
}
下面是它的样子


在实际应用程序中,您可能希望在循环中创建按钮,以避免混乱和代码重复。你必须设置他们的听众等等。因为它与布局管理无关,为了清晰起见,我跳过了它。

首先,尝试移动这个。setVisible(true);这个包();到构造函数的末尾。1)一个
GridBagLayout
就可以了。2) 为了更快地获得更好的帮助,请发布一个or。我之所以提到这一点,是因为涉及布局问题的问题不需要包含工具提示或操作侦听器。3) 不要覆盖零部件的首选尺寸以返回硬编码值。这纯粹是猜测。4) 另见此。它使用
ScriptEngine
计算文本字段中的表达式。它使用布局的组合,而不是单一的网格包布局。是否可以,如果不可以,它需要如何更改以满足要求?到目前为止,我所做的更改是:如果我删除Dimension getPreferredSize()方法并运行,那么计算器将以最小化大小显示,如果我按下窗口的最大化按钮,我将看到完整的计算器。如果使用这种方法,我可以得到所有的计算器,但体积很小。我想要一个更大的按钮和一个更大的布局,但我不明白怎么做,为什么C按钮的高度比文本框的高度大?