我试图在一个类中计算的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);
}
}
我对此很陌生,所以请不要去找我。我只需要知道这有什么问题。谢谢
最佳答案
我知道的一件事是您遇到了严重的参考问题。例如,在您第一个发布的actionPerformed方法中:
if (e.getSource() == payment) {
Payment paymentJ = new Payment(); // ***** line 1 ****
paymentJ.output.setText(output.getText()); // ***** line 2 ****
}
在上面的第1行中,创建一个名为PaymentJ的新Payment对象,在第2行中,通过调用
output.setText(...)
更改其状态。我猜测输出是一些文本组件,您正在尝试更改其显示的文本,但这是问题所在-虽然payJ指的是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行上,创建一个名为cost的新Main对象,在第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);
我敢打赌,您将看到返回的文本组件保留的默认值,而不是用户输入的或当前可视化的Main GUI中显示的值。
该怎么办?
好吧,您可以使输出字段为静态。那将是一个快速简便的解决方案,但是不幸的是它将是快速,简单且非常错误的,因为这会破坏OOPs原则,使您的代码很难测试,增强和继承。
更好的方法是在需要的地方传递引用,例如将对显示的Payment对象的引用传递给具有第一个actionPerformed方法的对象,然后在该对象上调用适当的方法,同样将有效的引用传递给显示的Main对象,将其对象显示在您的下部代码段中。这将允许您查询和修改有效显示对象的状态。这个怎么做?如果没有您提供的更好且有效的代码示例(根据我的评论),我无法具体告诉您如何执行此操作。通常,您可以使用构造函数和setter方法参数来传递引用。
最好的办法是使您的代码更像M-V-C或Model-View-Controller,但这可能对该程序来说是过大的,并且可能超出您当前的编码水平。
如需更多帮助,以获得更好的帮助,请改善您的问题。
根据您的新代码,
您的Payment类应该扩展JDialog,而不是JFrame,因为GUI应该只有一个主窗口
您将要通过
Payment paymenetJ = new Payment(this);
将Main传递到Payment中您将需要更改Payment构造函数以接受以下内容:
public Payment(Main main)
在构造函数中,使用参数设置字段:
this.main = main;
然后,使用此主字段而不是创建新的Main对象。