我有三个类,一个启动器类,一个计算类和一个Swing GUI类。
在GUI中,我有一个按钮,用于将选择提交给计算器类的方法(不是主类)。我已经验证该方法有效,并确实更改了GUI类上的标签(通过 System.out.println(guiTravel.trip_Miles.getText()); )。但是,Swing面板不会反映更改。
我尝试在计算方法中添加redraw(),revalidate(),repaint()和updateUI()。似乎都没有反映出这种变化。
任何想法都会受到高度赞赏?我对使用swing(和更多或更多的java)相对较新 减)。
这是启动方法按钮的代码:
private void Next_TripActionPerformed(java.awt.event.ActionEvent evt) {
sauCalc.calculateDistance();
}
这是计算类中的方法:
package sau_travel_log;
public class SAU_Calculator {
double[] BVS = new double[] { 0.0, 10.0, 18.0, 8.0, 4.2, 4.6, 17.0};
double[] HCMS = new double[] {10.0, 0.0, 9.6, 2.0, 5.8, 6.2, 15.0};
double[] PVS = new double[] {17.8, 9.6, 0.0, 9.8, 13.6, 14.0, 13.0};
double[] SAU = new double[] { 8.0, 2.0, 9.8, 0.0, 3.8, 4.2, 17.0};
double[] WES = new double[] { 4.2, 5.8, 13.6, 3.8, 0.0, 0.4, 20.8};
double[] WHS = new double[] { 4.6, 6.2, 14.0, 4.2, 0.4, 0.0, 21.2};
double[] WVS = new double[] {25.0, 15.0, 13.0, 17.0, 20.8, 21.2, 0.0};
double[][] distanceTraveled = {BVS, HCMS, PVS, SAU, WES, WHS, WVS};
int selectionOne;
int selectionTwo;
boolean endDayLoop = false;
boolean endMonthLoop = false;
double travelOfDay = 0.0;
double travelOfMonth = 0.0;
public SAU_Travel_Log_GUI guiTravel;
public void testClass(SAU_Travel_Log_GUI guiTravel) {
this.guiTravel = guiTravel;
}
public void calculateDistance() {
double tripMileage = distanceTraveled[selectionOne][selectionTwo];
travelOfDay += tripMileage;
guiTravel.trip_Miles.setText(String.valueOf(tripMileage));
guiTravel.day_Miles.setText(String.valueOf(travelOfDay));
guiTravel.month_Miles.setText(String.valueOf(travelOfMonth));
guiTravel.trip_Miles.repaint();
}
}
我更新了计算器类,以反映我对Hovercraft建议的更改。但是现在我得到以下内容:
线程中的异常“AWT-EventQueue-0”java.lang.NullPointerException
有什么想法吗?
答案 0 :(得分:1)
令人惊讶的是,你的问题正如我在第一篇评论中所猜测的那样(dang,我今天很幸运) - 你不知不觉中有一个类的一个实例然后设置它的文本:
public void calculateDistance() {
SAU_Travel_Log_GUI guiTravel = new SAU_Travel_Log_GUI(); // ****** here ***
这意味着对此SAU_Travel_Log_GUI状态的任何更改都将发生在不可见的SAU_Travel_Log_GUI对象中,因为此新实例与可视化SAU_Travel_Log_GUI实例完全不同。
解决问题的方法:不要这样做。在实际可视化GUI上设置标签的文本。要做到这一点,你可以在这个类的构造函数(或者你想要的setter方法)中传递实际的可视化实例:
public SomeClass {
private SAU_Travel_Log_GUI guiTravel;
public SomeClass(SAU_Travel_Log_GUI guiTravel) {
this.guiTravel = guiTravel;
// ... plus other methods
}
public void calculateDistance() {
// **** no need for this now
// **** SAU_Travel_Log_GUI guiTravel = new SAU_Travel_Log_GUI();
double tripMileage = distanceTraveled[selectionOne][selectionTwo];
travelOfDay += tripMileage;
// *** now you're setting text on actual components of the visualized GUI
guiTravel.trip_Miles.setText(String.valueOf(tripMileage));
guiTravel.day_Miles.setText(String.valueOf(travelOfDay));
guiTravel.month_Miles.setText(String.valueOf(travelOfMonth));
VALUE WHEN RAN
guiTravel.trip_Miles.repaint();
}
然后,当您调用此类的构造函数时,传入对实际可视化SAU_Travel_Log_GUI实例的引用。
注意:最好使用公共方法允许外部类在类的私有字段上设置文本。