为了账号安全,请及时绑定邮箱和手机立即绑定

JTextArea 不会显示以前的输入

JTextArea 不会显示以前的输入

largeQ 2022-01-12 16:36:36
我目前正在使用 GUI 开发计算器。这就是我的意思以及它应该如何工作。输入一串数字运算符号后,用户可以点击: a.'=',在这种情况下计算器必须显示: i. 第二个数字的最后一位数字后面的“=”符号 ii。操作的结果,在一个新的行上 iii。在“=”符号之后输入的任何其他内容都是新计算的一部分,并且必须显示在单独的行上例如,用户点击:123.45+456.2=1”。屏幕应如下所示:123.45+ 由用户输入456.2= 由用户输入579.65 由您的程序计算和显示这就是我希望计算器显示以前的输入并在单击数学运算符后转到新行的方式。请注意,我也尝试过追加,但没有成功。这就是我的计算器的样子。计算器:关于如何显示上面示例中的输出的任何帮助。
查看完整描述

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)。


希望这可以帮助。


查看完整回答
反对 回复 2022-01-12
?
翻过高山走不出你

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


查看完整回答
反对 回复 2022-01-12
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

display = textArea.getText();
textArea.setText(display + "3");

不要使用 getText() 和 setText()。它不是很有效。

每次使用 getText() 时,文本区域都需要解析 Document 以创建字符串。每次使用 setText() 时,文本区域都需要解析字符串以创建文档。

相反,您只需使用:

textArea.append( "3" );

更好的是,不要为每个按钮使用自定义侦听器。您可以为数字按钮共享一个通用侦听器。请参阅:如何在 java 中为 jbutton 添加快捷键?举个例子让你开始。

我希望计算器显示以前的输入并在单击数学运算符后转到新行。

然后,附加的 ActionListener (例如)将执行以下操作:

textArea.append( "+\n" );

您需要为所有运营商执行此操作。


查看完整回答
反对 回复 2022-01-12
  • 3 回答
  • 0 关注
  • 380 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信