Java Swing面板不会更新标签的显示
我有三个类,一个启动器类、一个计算类和一个Swing GUI类 在GUI中,我有一个按钮,用于将选择提交给计算器类(不是主类)的方法。我已经验证了该方法的有效性,并且确实更改了GUI类上的标签(通过System.out.println(guiTravel.trip\u Miles.getText());)。但是,Swing面板并不反映这些更改 我已经尝试添加了redraw()、revalidate()、repaint()和updateUI(),所有这些都是在calculations方法中添加的。所有这些似乎都没有反映出这一变化 如果您有任何想法,我们将不胜感激?我对使用swing(和java)还比较陌生 较少) 这是启动该方法的按钮的代码:Java Swing面板不会更新标签的显示,java,swing,user-interface,Java,Swing,User Interface,我有三个类,一个启动器类、一个计算类和一个Swing GUI类 在GUI中,我有一个按钮,用于将选择提交给计算器类(不是主类)的方法。我已经验证了该方法的有效性,并且确实更改了GUI类上的标签(通过System.out.println(guiTravel.trip\u Miles.getText());)。但是,Swing面板并不反映这些更改 我已经尝试添加了redraw()、revalidate()、repaint()和updateUI(),所有这些都是在calculations方法中添加的。
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();
}
}
我已经更新了计算器类,以反映我对气垫船建议的更改。但现在我得到了以下信息:
线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常
有什么想法吗?令人惊讶的是,你的问题正是我在第一次评论中猜到的(当,我今天很幸运)——你在不知不觉中拥有一个以上的类实例,然后设置它的文本:
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方法,如果需要)中传递实际的可视化实例:
然后,当调用该类的构造函数时,传入对实际可视化SAU_Travel_Log_GUI实例的引用
注意:最好使用公共方法来允许外部类在类的私有字段上设置文本。您在未显示的代码中遇到了问题,一个bug。也许您在不知不觉中拥有一个以上的类实例。。。。但谁知道呢。如果你没有得到及时的帮助,考虑创建并发布一个你把代码浓缩到最小的位,它仍然编译和运行,没有外部依赖关系(比如需要链接到一个数据库或图像),没有额外的与你的问题不相关的代码。但仍然说明了您的问题。我打赌丢失的代码需要像label.setText(newString)这样的东西,而不是重画和所有其他垃圾。@MarsAtomic:您很可能是对的。就我自己而言,我在读心术或猜测看不见的代码方面很糟糕。
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();
}