单击JTextArea中的按钮进行计算

时间:2016-07-01 01:01:22

标签: java swing actionlistener

我正在尝试在texArea中创建这样的计算,我在一个类中进行计算,然后将其传递到另一个类,只需单击按钮即可执行下一个计算。所以,如果我点击' m10py' ,无论我在TextArea中有什么,都会减少0.10。我尝试了一切,但它似乎并没有起作用。它不会抛出任何错误,但TextArea中的总数保持不变。 我的主要课程,它执行基本计算。

 public void actionPerformed(ActionEvent e) {

    double frontM = 9.50;
    double middleM = 7.30;
    double backM = 6.70;
    double vipM = 12.90;

    //double total1 = Double.parseDouble(output.getText());


    if (frontR.isSelected() && e.getSource() == calculate) {

        double total = Integer.parseInt(frontT.getText()) * frontM;

        output.setText(pounds.format(total));

    } else if (middleR.isSelected() && e.getSource() == calculate) {

        double total = Integer.parseInt(middleT.getText()) * middleM;

        String total2 = String.valueOf(total);

        output.setText(total2);

    } else if (backR.isSelected() && e.getSource() == calculate) {

        double total = Integer.parseInt(backT.getText()) * backM;
        output.setText(pounds.format(total));

    } else if (vipR.isSelected() && e.getSource() == calculate) {

        double total = Integer.parseInt(vipT.getText()) * vipM;
        output.setText(pounds.format(total));

    } else if (e.getSource() == cancel) {

        frontT.setText("1");
        middleT.setText("1");
        backT.setText("1");
        vipT.setText("1");
        output.setText("");

    }
    if (e.getSource() == payment) {
        Payment paymentJ = new Payment();
        paymentJ.output.setText(output.getText());

    }

}

将计算传递给另一个textArea的第二个类。我没有为每个按钮做这个,因为我无法计算..

public void actionPerformed(ActionEvent e) {
    Main main = new Main();
    //  double totalR = Double.parseDouble(output.getText());

    String cost = main.output.getText();
    double cost2 = Double.parseDouble(cost);
    double total;
    total = cost2;

    double m10py = 0.10;
    double m20py = 0.20;
    double m50py = 0.50;
    double m1p = 1.00;
    double m2p = 2.00;
    double m5p = 5.00;
    double m10po = 10.00;
    double m20po = 20.00;

    if (e.getSource() == m10p) {

        total = total - m10py;

        String total2 = String.valueOf(total);

        output.setText(total2);

    }

}

我对此很新,所以请不要去找我。我只需要知道这有什么问题。感谢

1 个答案:

答案 0 :(得分:1)

知道的一件事是,你有一个严重的参考问题。例如,在您发布的第一个actionPerformed方法中:

if (e.getSource() == payment) {
    Payment paymentJ = new Payment(); // ***** line 1 ****
    paymentJ.output.setText(output.getText());  // ***** line 2 ****
}

在上面的第1行,您可以创建一个名为paymentJ的付款对象,在第2行,您可以通过调用output.setText(...)来更改其状态。我猜测输出是一些文本组件,你试图更改它显示的文本,但这是问题 - 虽然paymentJ指的是Payment对象,但它不是正在显示的Payment对象,这是一个完全不同的独立对象,并通过尝试更改其显示的文本来更改此处创建的未显示的对象的状态,对实际显示的Payment对象中的输出文本组件没有任何影响。

同样在你的第二个发布的actionPerformed方法中:

Main main = new Main();  
//  double totalR = Double.parseDouble(output.getText());

String cost = main.output.getText(); // ***** line 1 ****
double cost2 = Double.parseDouble(cost); // ***** line 2 ****

在上面的第1行,您可以创建一个名为“成本”的主要对象,然后在第2行通过调用output.getText()来查询其状态。但是,此处创建的Main实例再次与显示的Main对象不同,这意味着您至少有两个(或更多)Main对象,其中只显示其中一个,从本地创建的数据中提取的数据不会反映对显示的数据所做的更改。您可以在提取文本后放置println来测试它,例如:

Main main = new Main();  
//  double totalR = Double.parseDouble(output.getText());

String cost = main.output.getText(); 
System.out.println("cost is currently: " + cost); // ***** add this ****
double cost2 = Double.parseDouble(cost); 

我敢打赌,您会看到返回的文本组件所保留的默认值,而不是用户输入的值或显示在当前可视化的主GUI中的值。

怎么办?

  • 好的,您可以输出字段静态。这将是一个快速简单的解决方案,但不幸的是它会快速,简单和非常错误,因为这会破坏OOP原则,使您的代码很难测试,增强和继承。
  • 最好是在需要的地方传递引用,例如将对显示的 Payment对象的引用传递给具有第一个actionPerformed方法的对象,然后在该对象上调用相应的方法,并且同样将对显示的主对象的有效引用传递给其代码显示在较低代码段中的对象。这将允许您查询和修改有效显示对象的状态。这该怎么做?如果没有更好的工作代码示例(根据我的评论),我无法具体告诉您如何做到这一点。通常,您可以使用构造函数和setter方法参数传递引用。
  • 最好是让您的代码更像M-V-C或模型 - 视图 - 控制器,但这可能对此程序来说太过分了,目前可能超出您当前的编码级别。

如需更多帮助,请提出更好的帮助。

根据您的新代码,

  • 您的Payment类应该扩展JDialog,而不是JFrame,因为GUI应该只有一个主窗口
  • 您需要通过Payment paymenetJ = new Payment(this);
  • 将Main传递给付款
  • 您需要更改付款构造函数以接受此操作:public Payment(Main main)
  • 在构造函数中使用参数来设置字段:this.main = main;
  • 然后使用此主要字段而不是创建新的Main对象。