感谢您的帮助。我是一个非常简单的新手。 我想要一个带有文本(JLabel)的窗口(面板),每隔几秒就会更改一次。整个应用程序工作正常,除了正在更新的JLabel(文本确实发生了变化),但它没有显示在窗口(面板)上。即使我有检查点告诉我JLabel的文本正在更新和更改,窗口始终保持相同的文本。我到处寻找同样的问题并找到了一些评论,但都没有帮助。有人说是ActionListener,但是当我摆脱它时它并没有什么区别。有人说线程中的循环没有让JLabel刷新,所以我尝试使用JLabel并且它的更新是在一个单独的线程上,而且也不起作用。我唯一没有尝试的是使用swingWorker(不太清楚如何)。线程尝试使用带有runnable方法的线程类。再说一遍,除了JLabel没有重新粉饰之外,一切都运作得很好。
这是没有线程的代码。这一切都在一个班级。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.*;
public class SWUI extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private JPanel panel;
JLabel label;
private Font font;
//Set up the interface. SWUI is working perfectly
SWUI() {
System.out.println("run started"); //just to check that the method gets called.
panel = new JPanel();
panel.setLayout(new BorderLayout(1, 1));
panel.setPreferredSize(new Dimension(1000, 400));
panel.setBackground(Color.white);
getContentPane().add(panel);
label = new JLabel("Ready"); //These four statements are working
label.setHorizontalAlignment(JLabel.CENTER);
font = new Font("Comic Sans MS", Font.PLAIN, 70);
label.setFont(font);
panel.add(label, BorderLayout.CENTER);
System.out.println("run done and draw to start");
label.setText("label is updatable"); //Checks that the whole method gets done and that the label is indeed able to get updated. It works.
}
// draw() mostly sets the Frame up, names it, sets closing behavior. It's working.
public void draw() {
System.out.println("draw started"); //To check that the method is getting invoked.
SWUI frame = new SWUI();
frame.setTitle("Sight Words Rock");
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
frame.addWindowListener(l);
frame.pack();
frame.setVisible(true);
System.out.println("draw done"); //To check that the whole method went through. It's all working.
}
//Should change the label to 4 sentences every 1 second. The text of the label does change, but it doesn't show on the interface (panel).
private void updateLabel(String word){
label.setText(word);
//label.revalidate(); //I tried these three statements one at a time and both together and they made no difference.
//label.updateUI();
//label.repaint();
System.out.println("The label now is: "+ label.getText()); //This confirms that the setText() is indeed changing the text
// of the label, but it doesn't show on the interface.
}
//Main gets the draw() started to initiate the interface and gets the sentences changed and sent to updateLabel() every second.
public static void main(String args[])
throws InterruptedException {
SWUI ui = new SWUI();
ui.draw();
String importantInfo[] = {
"Mares eat oats",
"Dogs eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
for (int i = 0;
i < importantInfo.length;
i++) {
//Pause for 1 second
Thread.sleep(1000);
//Print a message
System.out.println(importantInfo[i]);
ui.label.setText(importantInfo[i]);
ui.updateLabel(importantInfo[i]);
}
}
//This will come later once I figure how to fix the label. Someone else suggested that the problem were the listeners not letting the thread
// do the repainting(), but I tried getting rid of the "implements ActionListener" and the actionPerformed methods and it didn't make a
// difference. It still didn't work.
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
}
答案 0 :(得分:0)
draw
中的SWUI
方法创建了一个全新的框架,而您的更新将转到初始框架,而该框架从未真正设置为可见。要修复,您的绘制方法看起来应该更像这样。
public void draw() {
System.out.println("draw started"); //To check that the method is getting invoked.
setTitle("Sight Words Rock");
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(l);
pack();
setVisible(true);
System.out.println("draw done"); //To check that the whole method went through. It's all working.
}