Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法更新JLabel字段中的值。。在第二帧中单击第一帧上的按钮_Java_Swing_Thread Sleep_Observable - Fatal编程技术网

Java 无法更新JLabel字段中的值。。在第二帧中单击第一帧上的按钮

Java 无法更新JLabel字段中的值。。在第二帧中单击第一帧上的按钮,java,swing,thread-sleep,observable,Java,Swing,Thread Sleep,Observable,我同时打开了两个窗口,所以现在在第一个窗口框中单击一个Jbutton,我的Jlabel值应该在第二个窗口框中得到更新或更改。。。。我的问题是我在我的案例代码中使用了观察器模式,它工作得很好,我能够捕捉到最新的更新值,但在更新标签时,却没有更新settext 1] 这是我的函数(当临时值更改时调用,我在第一帧中单击更新按钮)。。我在Observable类中使用的这个函数-- 2] 现在它会通知观测者这里的温度发生了变化,我希望我的 curtempupbl.setText(“+curTempupd”

我同时打开了两个窗口,所以现在在第一个窗口框中单击一个Jbutton,我的Jlabel值应该在第二个窗口框中得到更新或更改。。。。我的问题是我在我的案例代码中使用了观察器模式,它工作得很好,我能够捕捉到最新的更新值,但在更新标签时,却没有更新settext

1] 这是我的函数(当临时值更改时调用,我在第一帧中单击更新按钮)。。我在Observable类中使用的这个函数--

2] 现在它会通知观测者这里的温度发生了变化,我希望我的 curtempupbl.setText(“+curTempupd”);在代码中,应更新第二帧中更改的值。。。但它没有得到更新。。。 注意:如果您看到我在设置jlabel之前和之后都给出了system.out.println,那么我能够捕获正确的更新值。。。但它没有在Jlabel中更新请帮助

     public void update(Observable obj, Object arg1) {
    // TODO Auto-generated method stub
     if(arg1 instanceof Integer){

        int  curTempupd = ((Integer)arg1).intValue();

        System.out.println("inside update value --------"+curTempupd);

        WeatherTablePanel frame = new WeatherTablePanel(weatherDb);

        frame.setVisible(true);
        curTempLbl.setText("" + curTempupd);

        //curTempLbl.repaint();  

        System.out.println("after update value --------"+curTempupd);

    }
@Override
public void update(Observable obj, Object arg1) {
    // TODO Auto-generated method stub
    if(arg1 instanceof Integer){

        int  curTempupd = ((Integer)arg1).intValue();

        System.out.println("inside update value --------"+curTempupd);

    //  

        new Thread(){  
              public void run(){  
                try{Thread.sleep(2000);
                }catch(InterruptedException ie){ie.printStackTrace();}  
                SwingUtilities.invokeLater(new Runnable(){  
                  public void run(){  
                      curTempLbl.setText("" + 89); 
                  }  
                });  
              }  
            }.start();  

            //


        //setVisible(true);




                        //curTempLbl.repaint();             




        System.out.println("after update value --------"+curTempupd);

    }   
这是我希望Jlabel更新的帧的代码

public WeatherTableFrame(WeatherDb weatherdb) {
  weatherTblUI = new WeatherTableUI(weatherdb);
  WindowListener exitListener = new FrameTerminator();
  addWindowListener(exitListener);
  setTitle("Weather Table");
  setSize(575,265); 
  add(weatherTblUI);
}

  // another class

      public WeatherTableUI(WeatherDb weatherDb) {
      weatherTblPanel = new WeatherTablePanel(weatherDb);
      addNewLocPanel = new AddNewLocPanel(weatherDb, weatherTblPanel);
      setLayout(new BorderLayout());
      add(weatherTblPanel, "Center");
      add(addNewLocPanel, "South");
      removeBtnPanel.add(removeLocBtn);
      add(removeBtnPanel, "East");
      removeLocBtn.addActionListener(this);
      }
3] 在weatherTblPanel中,我正在尝试更新Jlabel值

我在更新函数代码中使用了线程,但仍然没有更新,请帮助

     public void update(Observable obj, Object arg1) {
    // TODO Auto-generated method stub
     if(arg1 instanceof Integer){

        int  curTempupd = ((Integer)arg1).intValue();

        System.out.println("inside update value --------"+curTempupd);

        WeatherTablePanel frame = new WeatherTablePanel(weatherDb);

        frame.setVisible(true);
        curTempLbl.setText("" + curTempupd);

        //curTempLbl.repaint();  

        System.out.println("after update value --------"+curTempupd);

    }
@Override
public void update(Observable obj, Object arg1) {
    // TODO Auto-generated method stub
    if(arg1 instanceof Integer){

        int  curTempupd = ((Integer)arg1).intValue();

        System.out.println("inside update value --------"+curTempupd);

    //  

        new Thread(){  
              public void run(){  
                try{Thread.sleep(2000);
                }catch(InterruptedException ie){ie.printStackTrace();}  
                SwingUtilities.invokeLater(new Runnable(){  
                  public void run(){  
                      curTempLbl.setText("" + 89); 
                  }  
                });  
              }  
            }.start();  

            //


        //setVisible(true);




                        //curTempLbl.repaint();             




        System.out.println("after update value --------"+curTempupd);

    }   

猜测:您正在更新错误对象中的JLabel,即您创建了同一类的新对象,并且正在更新未显示的新对象中的JLabel,而保留旧对象不变

注:如果你想要一个答案,这不仅仅是一个疯狂的猜测,再次,真的应该强烈地考虑创建和张贴给我们,让我们了解你的问题。
编辑
是的,您实际上正在创建一个全新的对象,并更改新对象上的JLabel:

public void update(Observable obj, Object arg1) {
     if(arg1 instanceof Integer){
        int  curTempupd = ((Integer)arg1).intValue();
        WeatherTablePanel frame = new WeatherTablePanel(weatherDb);  // ***** here *****
        frame.setVisible(true);
        curTempLbl.setText("" + curTempupd);
    }   
}
解决方案:不要在更新方法中创建新的WeatherTablePanel。而是更改已可见的WeatherTablePanel实例的状态。如何做到这一点将取决于更多未显示的代码


另一个问题:你在哪里把你的观察者和你的可观察对象连接起来,在可观察对象上你在哪里调用
.addObserver(…)

比如说,

import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.util.Observable;
import java.util.Observer;
import javax.swing.*;
import javax.swing.event.*;

public class TestObserver {

   private static void createAndShowGui() {
      MyObservable observable = new MyObservable();
      MyObserver observer = new MyObserver();

      observable.addObserver(observer); // ********* Most important line of code!! *********

      JFrame frame = new JFrame("Observable");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(observable.getMainPanel());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);

      JDialog dialog = new JDialog(frame, "Observer", ModalityType.MODELESS);
      dialog.add(observer.getMainPanel());
      dialog.pack();
      dialog.setLocationRelativeTo(frame);
      dialog.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyObservable extends Observable {
   private int number;
   private JPanel mainPanel = new JPanel();
   private JSpinner numberSpinner = new JSpinner(new SpinnerNumberModel(50, 0,
         100, 1));

   public MyObservable() {
      mainPanel.add(new JLabel("Change Value:"));
      mainPanel.add(numberSpinner);
      mainPanel.setPreferredSize(new Dimension(400, 350));
      numberSpinner.addChangeListener(new NumberChangeListener());
   }

   public int getNumber() {
      return number;
   }

   public void setNumber(int number) {
      this.number = number;
      setChanged();
      notifyObservers(Integer.valueOf(number));
   }

   public JPanel getMainPanel() {
      return mainPanel;
   }

   private class NumberChangeListener implements ChangeListener {

      @Override
      public void stateChanged(ChangeEvent e) {
         setNumber(((Integer) numberSpinner.getValue()).intValue());
      }
   }
}

class MyObserver implements Observer {
   private static final String LABEL_TEXT = "Number is: ";
   private JPanel mainPanel = new JPanel();
   private JLabel label = new JLabel(LABEL_TEXT + 50);

   public MyObserver() {
      mainPanel.add(label);
      mainPanel.setPreferredSize(new Dimension(150, 100));
   }

   @Override
   public void update(Observable o, Object arg) {
      int value = ((Integer) arg).intValue();
      label.setText(LABEL_TEXT + value);
   }

   public JPanel getMainPanel() {
      return mainPanel;
   }
}

所以没有你的代码。。。我们应该猜猜你做错了什么。。。。怎样?不过说真的,请给我们足够的信息,这样我们就不必胡乱猜测了,最好是一个好消息。请查看链接以了解这个非常有用的工具的详细信息。1]这是我的可观察类的函数//12280sv*/public void updatetemp(int temp){System.out.println(“当temp更新时”+temp);this.temp=temp;setChanged();//它说我们有Chansomething//所以你需要通知观察员System.out.println(“before”);notifyobserver(temp);//notify System.out.println(“notified”);}/*12280Sv*/ 1)请不要在注释中张贴代码,因为它失去了格式化,使其不可读。相反,将任何新代码张贴到原始问题的底部。2)你确实应该强烈地考虑创建和发布给我们,让我们了解你的问题。嘿,我猜是正确的。请看编辑回答。帮助我,我已将我的问题与code@VaibhaviShah:您仍然没有添加足够的代码,例如,您在可观察对象上调用
.addObserver(…)
的最重要的代码行,并传入一个观察者。例如。。。