JLabel setText不更新文本

时间:2012-04-12 22:35:29

标签: java swing user-interface jlabel

我正在尝试使用setText()方法更新JLabel,但我无法重绘JLabel。我是否必须使用repaint()方法来执行此操作?

这是代码的一部分,我没有得到任何错误,但它没有更新JLabel。

public void actionPerformed(ActionEvent e) {
    fc = new JFileChooser();
    if(e.getSource() == addButton) {
         int returnVal = fc.showOpenDialog(Main.this);
         if (returnVal == JFileChooser.APPROVE_OPTION) {
                filesList = fc.getSelectedFiles();
                setFilesList(filesList);

                StringBuilder logString = new StringBuilder();
                logString.append("Files to Convert " + "\n");
                for(int i = 0; i < getFiles().length; i++) {
                    logString.append(filesList[i].getAbsolutePath());
                }
                //JLabel log = new JLabel(); created above.
                log.setText(logString.toString());
            } else {
                //log.append("Open command cancelled by user." + newline);
        }
        //log.setCaretPosition(log.getDocument().getLength());
    }
}

5 个答案:

答案 0 :(得分:10)

JLabel不需要重新调用。简单地调用setText(...)将改变标签的文本,这就是所需要的。

我想知道你的问题是否是一个并发问题,你是在Swing事件线程上进行长时间运行的进程,这是在阻止你的标签更新其文本。

如果是这样,那么考虑在后台线程中执行长时间运行的进程,例如SwingWorker提供的进程,然后在Swing线程上更新JLabel的文本,例如可以通过SwingWorker的发布/处理方法完成。

有关详情,请查看Lesson: Concurrency in Swing教程。

另外Mario De ...对于无法在JLabel上打印简单的新行是正确的。他的回答是1+。

答案 1 :(得分:2)

我对在Java中重新绘制帧/组件的方式感到有点困惑。您可以根据javadoc调用Paint(Graphics g) update(Graphics g)paint(g)。最后还有repaint() ...

如果这些似乎都不起作用,那么仅在您当前尝试设置文本的行创建标签会不会更容易?

编辑:还可以选择使用不可用的textArea。它不仅可以显示标准换行符,还可以将其放在jScrollPane中,当日志中有大量文件时,这很方便,并且您不需要重新绘制文本组件以显示更新的文本。奖金是宏伟的... ...

答案 2 :(得分:2)

这个简单的例子对我有用,所以问题不是JLabel,而是源代码其他部分的一些错误。请发布完整的源代码。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Application {

public static void main(String[] args) {
    JFrame frame = new JFrame("JLabel test");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    Panel p = new Panel();
    p.setLayout(new GridLayout());

    Button button = new Button("Change");
    final JLabel label = new JLabel(Long.toString(Long.MAX_VALUE));

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            label.setText(Long.toString(e.getWhen()));
        }
    });

    p.add(button);
    p.add(label);
    frame.add(p, BorderLayout.NORTH);
    frame.pack();

}
}

答案 3 :(得分:2)

我遇到了类似的问题。我在退出按钮ActionListener中尝试setText("Good Bye") actionPerformed(),然后将JFrame放在那里,但文本没有改变。

最终我意识到我的标签没有得到更新,因为我在匿名的ActionListener类中处理框架。在我让代码离开ActionListener.actionPerformed()之后,标签文本得到了更新。

我必须将我的JFrame放在新线程中,以确保:

  1. actionPerformed已完成,主线程从匿名嵌套类返回并更新主类中的标签。

  2. 启动新线程,等待一秒钟,以便阅读“再见”。

  3. 这个新线程配置框架。

答案 4 :(得分:1)

repaint()在这里工作不了。

只需使用label_name.paintImmediately(label_name.getVisibleRect());

即可

它会立即更新。