Java Swing Panel不会更新标签的显示

时间:2014-05-19 02:29:17

标签: java swing user-interface

我有三个类,一个启动器类,一个计算类和一个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

有什么想法吗?

1 个答案:

答案 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实例的引用。

注意:最好使用公共方法允许外部类在类的私有字段上设置文本。