Java 无法更新JLabel字段中的值。。在第二帧中单击第一帧上的按钮
我同时打开了两个窗口,所以现在在第一个窗口框中单击一个Jbutton,我的Jlabel值应该在第二个窗口框中得到更新或更改。。。。我的问题是我在我的案例代码中使用了观察器模式,它工作得很好,我能够捕捉到最新的更新值,但在更新标签时,却没有更新settext 1] 这是我的函数(当临时值更改时调用,我在第一帧中单击更新按钮)。。我在Observable类中使用的这个函数-- 2] 现在它会通知观测者这里的温度发生了变化,我希望我的 curtempupbl.setText(“+curTempupd”);在代码中,应更新第二帧中更改的值。。。但它没有得到更新。。。 注意:如果您看到我在设置jlabel之前和之后都给出了system.out.println,那么我能够捕获正确的更新值。。。但它没有在Jlabel中更新请帮助Java 无法更新JLabel字段中的值。。在第二帧中单击第一帧上的按钮,java,swing,thread-sleep,observable,Java,Swing,Thread Sleep,Observable,我同时打开了两个窗口,所以现在在第一个窗口框中单击一个Jbutton,我的Jlabel值应该在第二个窗口框中得到更新或更改。。。。我的问题是我在我的案例代码中使用了观察器模式,它工作得很好,我能够捕捉到最新的更新值,但在更新标签时,却没有更新settext 1] 这是我的函数(当临时值更改时调用,我在第一帧中单击更新按钮)。。我在Observable类中使用的这个函数-- 2] 现在它会通知观测者这里的温度发生了变化,我希望我的 curtempupbl.setText(“+curTempupd”
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(…)
的最重要的代码行,并传入一个观察者。例如。。。