【问题标题】:Calculation with clicking on a button within JTextArea通过单击 JTextArea 中的按钮进行计算
【发布时间】:2026-01-19 20:05:01
【问题描述】:

我正在尝试在我在一个类中计算的 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);

    }

}

我对此很陌生,所以请不要对我进行尝试。我只需要知道这有什么问题。谢谢

【问题讨论】:

  • 如果您创建并发布了一个有效的minimal reproducible example 会很有帮助,这是一个小而完整的程序,只有必要的代码来演示您的问题,我们可以复制、粘贴、编译和运行而无需修改,因为这将帮助我们充分了解您可能做错了什么。请注意,这是作为代码格式文本发布的代码,而不是作为到场外资源的链接。
  • 我确实说明了问题所在,并在下面链接了必要的代码,这是在“actionPerformed”方法中执行计算真正需要的代码。任何其他编码都将是不必要的,它们只是框架等的属性......我不理解反对票,也没有关于你们这些简单问题的回复?
  • 如果您阅读 minimal reproducible example 链接以了解它为什么重要、为什么它可以帮助我们更好地理解您的问题、为什么它会帮助我们提供体面和快速回答。例如,如果您在回复之前阅读了链接,您就会知道我们能够编译和运行您的代码,我们能够对可运行代码进行调整,这使我们能够更好地查看所涉及的任何和所有问题。同样,我们不是要求查看整个程序,只是一个可运行的小示例。是的,这意味着我们要求您提供额外的工作......(待续)
  • ...但请理解您要求志愿者提供免费工作,所以这真的对您要求太多了吗?这真的是我们的无理取闹吗?我可以保证,如果您这样做,如果您在此处发布此代码(同样不在链接中),并且您做得不错,那么反对票将变为赞成票,您可能会得到一个答案很快。您的来电。
  • 另外,最重要的是——您的代码中哪里出现了错误?你能告诉我们吗?我当然不能只看它就告诉你,但是有了minimal reproducible example,我将有更大的机会这样做。

标签: java swing actionlistener


【解决方案1】:

确实知道的一件事是您遇到了严重的参考问题。例如在您发布的第一个 actionPerformed 方法中:

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

在上面的第 1 行,您创建了一个 new 支付对象,称为 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 行,您创建了一个 new 主对象,称为 cost,在第 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 原则,使您的代码非常难以测试、增强和继承。
  • 最好在需要的地方传递引用,例如将对显示支付对象的引用传递给具有第一个 actionPerformed 方法的对象,然后对该对象调用适当的方法,并且同样将一个对 displayed Main 对象的有效引用传递到其代码显示在您的较低代码 sn-p 中的对象中。这将允许您查询和修改有效显示对象的状态。这个怎么做?如果没有您提供的更好且有效的代码示例(根据我的 cmets),我无法具体告诉您如何执行此操作。通常,您可以使用构造函数和 setter 方法参数来传递引用。
  • 最好是让您的代码更像 M-V-C 或 Model-View-Controller,但这对于该程序来说可能是多余的,并且可能超出您目前的编码水平。

如需更多帮助,更好的帮助,请改进您的问题。


根据您的新代码,

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

【讨论】:

  • 我会用一个更具体的问题重新发布这个问题,并按照你说的链接我的代码,因为我的问题似乎不够清楚。
  • 我通过粘贴整个程序重新发布了我的问题,这可能会给您带来问题所在。任何帮助将不胜感激。 *.com/questions/38165324/…