当另一个方法使用setText时,JPanel上的JLabel不会更新

时间:2015-07-12 16:59:02

标签: java swing jlabel settext

感谢您的帮助。我是一个非常简单的新手。 我想要一个带有文本(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

    }
}

1 个答案:

答案 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.

}