Java Swing面板不会更新标签的显示

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方法中添加的。

我有三个类,一个启动器类、一个计算类和一个Swing GUI类

在GUI中,我有一个按钮,用于将选择提交给计算器类(不是主类)的方法。我已经验证了该方法的有效性,并且确实更改了GUI类上的标签(通过System.out.println(guiTravel.trip\u Miles.getText());)。但是,Swing面板并不反映这些更改

我已经尝试添加了redraw()、revalidate()、repaint()和updateUI(),所有这些都是在calculations方法中添加的。所有这些似乎都没有反映出这一变化

如果您有任何想法,我们将不胜感激?我对使用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();
   }
}
我已经更新了计算器类,以反映我对气垫船建议的更改。但现在我得到了以下信息:

线程“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();
    }