gpt4 book ai didi

使用 JTextField 问题的 Java 计算器程序

转载 作者:行者123 更新时间:2023-11-30 08:45:28 24 4
gpt4 key购买 nike

import java.awt.Font;
import java.awt.GridLayout;

import javax.swing.JPanel;
import javax.swing.JTextField;

public class CalField extends JPanel {
private JTextField field;

public CalField() {

setLayout(new GridLayout(1, 1, 5, 5));
field = new JTextField(20);
field.setFont(new Font("SansSerif", Font.PLAIN, 20));
field.setEditable(true);
add(field);

}

public JTextField getField() {
return field;
}

public void setField(String text) {
field.setText(text);
System.out.print(text);

}
}

CalButton 类:

import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class CalButton extends JPanel {
private JButton[] buttons;
private static final String[] buttonNames = { "7", "8", "9", "/", "4", "5",
"6", "*", "1", "2", "3", "-", "0", ".", "=", "+" };
private CalField calField;

public CalButton() {
buttons = new JButton[buttonNames.length];
setLayout(new GridLayout(4, 4, 3, 3));
calField = new CalField();
ButtonListener handler = new ButtonListener();
for (int i = 0; i < buttonNames.length; i++) {
buttons[i] = new JButton(buttonNames[i]);
buttons[i].setFont(new Font("SansSerif", Font.BOLD, 20));

add(buttons[i]);
buttons[i].addActionListener(handler);
}

}

private class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
// TODO Auto-generated method stub

if (buttons[0].getActionCommand() == event.getActionCommand()) {
calField.setField(event.getActionCommand());
// System.out.print(buttons[0].getActionCommand());
} else if (buttons[1].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[1].getActionCommand());
} else if (buttons[2].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[2].getActionCommand());
} else if (buttons[3].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[3].getActionCommand());
} else if (buttons[4].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[4].getActionCommand());
} else if (buttons[5].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[5].getActionCommand());
} else if (buttons[6].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[6].getActionCommand());
} else if (buttons[7].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[7].getActionCommand());
} else if (buttons[8].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[8].getActionCommand());
} else if (buttons[9].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[9].getActionCommand());
} else if (buttons[10].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[10].getActionCommand());
} else if (buttons[11].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[11].getActionCommand());
} else if (buttons[12].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[12].getActionCommand());
} else if (buttons[13].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[13].getActionCommand());
} else if (buttons[14].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[14].getActionCommand());
} else if (buttons[15].getActionCommand() == event
.getActionCommand()) {
System.out.print(buttons[15].getActionCommand());
}
}
}
}

计算器类:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class Calculator {
public static void main(String[] args) {

JFrame application = new JFrame("Calculator");
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.setSize(250, 200);

CalField calField = new CalField();
CalButton calButton = new CalButton();

application.add(calField, BorderLayout.PAGE_START);
application.add(calButton, BorderLayout.CENTER);

application.setVisible(true);
}
}

在这个程序中,在JButton的 actionListener 我称之为 CalField 类的 setText()JTextField中设置相应按钮文本的方法.

但控制台中显示的文本却未显示在 TextField 中.我现在能做什么?请帮助我。

最佳答案

因此,在您的 Calculator 类中,您创建一个 CalField 实例并将其添加到 JFrame...

public class Calculator {
public static void main(String[] args) {

JFrame application = new JFrame("Calculator");
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.setSize(250, 200);

CalField calField = new CalField();
CalButton calButton = new CalButton();

application.add(calField, BorderLayout.PAGE_START);
application.add(calButton, BorderLayout.CENTER);

application.setVisible(true);
}
}

然后,在您的 CalButton 类中,您创建了 CalField 的另一个实例...

public class CalButton extends JPanel {
//...
private CalField calField;

public CalButton() {
//...
calField = new CalField();
//...
}

这永远不会添加到任何东西,而是您尝试更新的实例。此 CalField 实例与您添加到框架的 CalField 实例无关。

相反,您需要将 CalField 的实例传递给 CalButton

public class CalButton extends JPanel {
//...
private CalField calField;

public CalButton(CalField calField) {
//...
this.calField = calField;
//...
}

然后在您的Calculator 类中,您会将创建的CalField 实例传递给CalButton 实例...

CalField calField = new CalField();
CalButton calButton = new CalButton(calField);

application.add(calField, BorderLayout.PAGE_START);
application.add(calButton, BorderLayout.CENTER);

这创建了实际显示在屏幕上的类之间的关系

Now when i clicking on a button this shows the text but when i click another button it overrides the previous one's text. How to solve this problem so that the overriding does'nt occur

那是因为 setText 就是这样做的,它设置字段的文本,替换之前的内容。

相反,当您调用 setField 时,您应该在字段中追加新的下一个文本,例如...

public void setField(String text) {
field.setText(field.getText() + text);
System.out.print(text);

}

但我可能会将该方法更改为 appendField,以便清楚它的作用

此外,因为 actionPerformed 中的大部分 if-else 语句实际上并没有做任何事情,它们所做的几乎是同一件事,

if (buttons[0].getActionCommand() == event.getActionCommand()) {
calField.setField(event.getActionCommand());
} else if (buttons[1].getActionCommand() == event.getActionCommand()) {
System.out.print(buttons[1].getActionCommand());
} else if (buttons[2].getActionCommand() == ...

你可以做一些更像...

calField.setField(event.getActionCommand());

现在,您可能需要为特殊键添加一些if语句,例如=和clear,但所有其他数字按钮,只需要执行上述操作,这应该会大大减少重复的代码,让代码维护起来更容易

关于使用 JTextField 问题的 Java 计算器程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com