3 回答
TA贡献1846条经验 获得超7个赞
只要它们是 0-9,您希望数字进入同一行,对吗?这会做到的。与其创建 10 个 JButton 对象,不如创建一个数组并使用循环初始化它们,并相应地向它们添加一个动作侦听器。
private JButton[] buttons;
buttons = new JButton[10];
for(int i = 0; i < buttons.length; i++) {
// Make all the buttons and add them to the panel
panel1.add(buttons[i] = new JButton(String.valueOf(i)));
// Add an actionlistener to each of them
buttons[i].addActionListener(this);
}
以下是您如何为这些按钮使用 actionListener 接口(确保一开始就在 CalculatorFrame 类中实现它):
@Override
public void actionPerformed(ActionEvent e) {
for(int i = 0; i < buttons.length; i++) {
// Check if the button pressed was a button0 - button 9
if(e.getSource() == buttons[i]) {
// whichever button (0-9) was pressed, append its result into display string
display += String.valueOf(i);
}
}
// Now set the result into your text area
textArea.setText(display);
}
现在每次按下按钮时,它将在同一行而不是新的,因为您没有直接更改 textArea 的值,而是将一个字符串放入其中,每次按下时都会附加一个字符串按钮。
所以最初,显示变量的值是什么。当你按下 1 时,它变为 1 并显示在 textArea 中。现在,当您按 2 时,显示的值变为 display = display + "2"。这一次,当您将显示变量传递给 textArea 时,它不仅会丢失值,因为它没有被直接编辑。
您可以使用此逻辑来修复您的其他方法。此外,由于所有值都是字符串,因此要执行计算,您需要将字符串转换为整数。在这种情况下,您可以使用 Integer.valueOf(display)。
希望这可以帮助。
TA贡献1875条经验 获得超3个赞
要在上述操作后显示文本,您可以通过向 setText 方法添加必要的文本来实现:textArea.setText(display + "+ enter by user\n") 或类似的任何内容。但它不会帮助您获得结果,并且您会收到一条错误消息。为什么?因为您在读取第二个变量“equalTemp = Double.parseDouble(textArea.getText())”时遇到问题。事实上,此方法会取出 textArea 中显示的所有值/字符/等,因此会给您一条错误消息,因为无法将它们全部转换为 Double 格式。要解决此问题,您必须更改输入值的保存方式。例如,您可以将 textArea 中的所有文本转换为字符串,然后使用特定符号将其拆分(),然后将剩余的值保存为 Double 值。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.util.regex.PatternSyntaxException;
class CalculatorFrame extends JFrame {
/**
* All the buttons that will be used in the calculator have been initialized
*/
private JButton button1;
private JButton button2;
private JButton button3;
private JButton button4;
private JButton button5;
private JButton button6;
private JButton button7;
private JButton button8;
private JButton button9;
private JButton button0;
private JButton buttonEqual;
private JButton buttonDot;
private JButton buttonClearLast;
private JButton buttonClearAll;
private JButton buttonAdd;
private JButton buttonSub;
private JButton buttonMul;
private JButton buttonDiv;
private JTextArea textArea;
private JScrollPane scrollPane;
String display = "";
String[] arr;
private double result;
Boolean additionBoolean = false;
Boolean subtractionBoolean = false;
Boolean multiplicationBoolean = false;
Boolean divisionBoolean = false;
Boolean equals = false;
public CalculatorFrame(){
JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayout(1,1));
panel2.add(buttonClearLast = new JButton ("Clear Last"));
panel2.add(buttonClearAll = new JButton ("Clear All"));
add(panel2, BorderLayout.PAGE_START);
JPanel panel3 = new JPanel();
textArea = new JTextArea(10, 20);
scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
add(scrollPane);
add(panel3, BorderLayout.AFTER_LAST_LINE);
JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(4,4));
panel1.add(button7 = new JButton ("7"));
panel1.add(button8 = new JButton ("8"));
panel1.add(button9 = new JButton ("9"));
panel1.add(buttonAdd = new JButton ("+"));
panel1.add(button4 = new JButton ("4"));
panel1.add(button5 = new JButton ("5"));
panel1.add(button6 = new JButton ("6"));
panel1.add(buttonSub = new JButton ("-"));
panel1.add(button1 = new JButton ("1"));
panel1.add(button2 = new JButton ("2"));
panel1.add(button3 = new JButton ("3"));
panel1.add(buttonMul = new JButton ("*"));
panel1.add(button0 = new JButton ("0"));
panel1.add(buttonDot = new JButton ("."));
panel1.add(buttonEqual = new JButton ("="));
panel1.add(buttonDiv = new JButton ("/"));
add(panel1, BorderLayout.PAGE_END);
pack();
// buttonClearLast.addActionListener(new ListenToClearLast());
buttonClearAll.addActionListener(new ListenToClearAll());
button1.addActionListener(e -> {textArea.setText(display() + "1");});
button2.addActionListener(e -> {textArea.setText(display() + "2");});
button3.addActionListener(e -> {textArea.setText(display() + "3");});
button4.addActionListener(e -> {textArea.setText(display() + "4");});
button5.addActionListener(e -> {textArea.setText(display() + "5");});
button6.addActionListener(e -> {textArea.setText(display() + "6");});
button7.addActionListener(e -> {textArea.setText(display() + "7");});
button8.addActionListener(e -> {textArea.setText(display() + "8");});
button9.addActionListener(e -> {textArea.setText(display() + "9");});
button0.addActionListener(e -> {textArea.setText(display() + "0");});
buttonAdd.addActionListener(e -> {textArea.setText(display() + "+ enterd by user\n"); additionBoolean = true;});
buttonSub.addActionListener(e -> {textArea.setText(display() + "- enterd by user\n"); subtractionBoolean = true;});
buttonMul.addActionListener(e -> {textArea.setText(display() + "* enterd by user\n"); multiplicationBoolean = true;});
buttonDiv.addActionListener(e -> {textArea.setText(display() + "/ enterd by user\n"); divisionBoolean = true;});
buttonDot.addActionListener(e -> {textArea.setText(display() + ".");});
buttonEqual.addActionListener(e -> {calculation();
textArea.setText(display() + "= enterd by user\n" + result + " this is your result");
});
}
private String display() {
display = textArea.getText();
return display;
}
private void calculation() {
String str = display();
if (additionBoolean == true) {
arr = str.split("\\+ enterd by user");
result = Double.parseDouble(arr[0]) + Double.parseDouble(arr[1]);
}
else if (subtractionBoolean == true) {
arr = str.split("- enterd by user");
result = Double.parseDouble(arr[0]) - Double.parseDouble(arr[1]);
}
else if (multiplicationBoolean == true) {
arr = str.split("\\* enterd by user");
result = Double.parseDouble(arr[0]) * Double.parseDouble(arr[1]);
}
else if (divisionBoolean == true) {
arr = str.split("/ enterd by user");
result = Double.parseDouble(arr[0]) / Double.parseDouble(arr[1]);
}
}
/**
* This is where the action listener listens to all the button being pressed
* Once heard, it will show case it to the TextArea of the calculator.
*/
public class ListenToClearAll implements ActionListener{
public void actionPerformed (ActionEvent e){
textArea.setText("");
additionBoolean = false;
subtractionBoolean = false;
multiplicationBoolean = false;
divisionBoolean = false;
}
}
}
例如,您将得到总和为 9.25 和 23.7 的下一个结果:
9.25+ enterd by user
23.7= enterd by user
32.95 this is your result
TA贡献1789条经验 获得超10个赞
display = textArea.getText(); textArea.setText(display + "3");
不要使用 getText() 和 setText()。它不是很有效。
每次使用 getText() 时,文本区域都需要解析 Document 以创建字符串。每次使用 setText() 时,文本区域都需要解析字符串以创建文档。
相反,您只需使用:
textArea.append( "3" );
更好的是,不要为每个按钮使用自定义侦听器。您可以为数字按钮共享一个通用侦听器。请参阅:如何在 java 中为 jbutton 添加快捷键?举个例子让你开始。
我希望计算器显示以前的输入并在单击数学运算符后转到新行。
然后,附加的 ActionListener (例如)将执行以下操作:
textArea.append( "+\n" );
您需要为所有运营商执行此操作。
添加回答
举报