当来自其他方法的setText时,JPanel上的JLabel不更新 [英] JLabel on JPanel doesn't update when setText from another method

查看:80
本文介绍了当来自其他方法的setText时,JPanel上的JLabel不更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

感谢您的帮助.我是一个新手,尝试一些非常简单的事情. 我想要一个窗口(面板),其文本(JLabel)每隔几秒钟更改一次.除了正在更新的JLabel(文本确实发生了更改)之外,整个应用程序都可以正常运行,但是它不会显示在窗口(面板)上.即使我有检查点告诉我JLabel的文本正在更新和更改,该窗口也始终保留相同的文本.我到处都在寻找相同的问题,但发现了一些评论,但没有一个帮助.有人说是ActionListener,但是当我摆脱它时,并没有什么不同.有人说线程中的循环不允许JLabel刷新,所以我试着让JLabel和它的更新在一个单独的线程上,这也不起作用.我唯一没有尝试过的方法是使用swingWorker(不太了解如何使用).线程尝试使用带有可运行方法的线程类.同样,除了JLabel不会重新绘制自身之外,其他所有内容都可以正常运行.

Thank you for your help. I'm a newbie trying something quite simple. I want to have a window (panel) with a text (JLabel) that changes every few seconds. The whole application is working perfectly except for the JLabel that is being updated (the text does change), but it doesn't show on the window (panel). The window keeps the same text from beginning to end even though I have checkpoints that tell me that the text of the JLabel is being updated and changing. I've looked for the same issue everywhere and have found some comments, but none helped. Someone said is the ActionListener, but when I got rid of it it didn't make a difference. Someone said the loop in the thread doesn't let the JLabel refresh so I tried having the JLabel and it's update being on a separate thread and that didn't work either. The only thing I haven't tried is using a swingWorker (don't quite know how). The thread attempt was with a thread class with a runnable method. Again, that way everything worked perfectly, except that the JLabel didn't repaint itself.

这是没有线程的代码.全都在一堂课中.

Here's is the code without the thread. It's all in one class.

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

    }
}

推荐答案

您的SWUI中的draw方法会创建一个全新的框架,而您的更新将转到从未真正设置为可见的初始框架.要解决此问题,您的draw方法应更像这样.

Your draw method in SWUI creates an entirely new frame while your updates go to the initial frame which is never really set visible. To fix, your draw method should look more like this.

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.

}

这篇关于当来自其他方法的setText时,JPanel上的JLabel不更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆