5

我正在尝试使用该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());
    }
}
4

6 回答 6

14

JLabel 不需要重绘调用。只需调用 setText(...) 将更改标签的文本,这就是所有需要的。

我想知道您的问题是否是并发问题,您正在 Swing 事件线程上执行长时间运行的过程,这会阻止您的标签更新其文本。

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

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

此外,Mario De... 关于无法在 JLabel 上打印简单的换行符是正确的。1+他的回答。

于 2012-04-12T22:51:59.637 回答
5

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

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

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

于 2012-04-12T22:47:53.403 回答
4

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

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

我不得不在一个新线程中处理我的 JFrame 以确保:

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

  2. 启动一个新线程,等待一秒钟以允许读取“再见”。

  3. 这个新线程配置框架。
于 2013-07-01T11:35:12.677 回答
4

这个简单的例子对我有用,所以问题不是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();

}
}
于 2012-04-12T22:53:40.103 回答
2

repaint()不会在这里工作。

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

它将立即更新。

于 2018-05-22T09:11:22.800 回答
0

请试试 -

jlabel.setText("Your Text");
jLabel.setVisisble(true);
于 2021-09-27T06:07:31.503 回答