JLabel setText不更新文本

Isu*_*uru 2 java user-interface swing 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 10

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

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

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

有关这方面的更多信息,请查看课程:Swing中的并发教程.

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


Mar*_*oDS 5

我对 Java 中框架/组件的重绘如何工作有点困惑。你可以Paint(Graphics g)update(Graphics g)根据 javadoc 只是调用paint(g)。最后还有repaint()...

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

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