我尝试创建这个计算器:
我想使用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();
}
}
}
CalculatorTest.java
public class CalculatorTest
{
public static void main(String[] args)
{
java.awt.EventQueue.invokeLater(() -> {
new Calculator().setVisible(true);
});
}
}
我使用GridBagLayout更改代码,但我不明白这一点。
到目前为止我的更改:如果我删除了Dimension getPreferredSize()方法并运行,那么计算器显示的是最小化的大小,如果我按下窗口的“最大化”按钮,那么我会看到完整的计算器。
如果使用这种方法,我会得到所有的计算器,但尺寸很小。
我想要一个更大的按钮和一个更大的布局,但我不明白该怎么做。
为什么C按钮的高度大于文本框高度?
答案 0 :(得分:1)
GridBagLayout
将完全符合您的要求。每次使用此布局将对象添加到容器时,都可以指定一组约束来定义要放置的位置。
在下面的简单示例中,您可以看到我使用new Insets(5,5,5,5);
在组件之间添加了一些空格,并确保通过设置fill
来填充整个单元格属性为GridBagConstraints.HORIZONTAL
,等等。
所有这些约束都在这个Oracle教程中得到了很好的解释,它应该告诉你如何使用这个布局管理器。
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);
});
}
}
以下是它的样子。
在实际应用程序中,您希望在循环中创建按钮以避免混乱和代码重复。你必须设置他们的听众等等。由于它与布局管理无关,为了清晰起见,我已跳过它。