JLabel setText不起作用

我试图通过使用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()); } } 

JLabel不需要重新调用。 只需调用setText(…)就可以更改标签的文本,这就是所需要的。

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

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

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

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

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

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

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

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

 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(); } } 

我遇到了类似的问题。 在将JFrame放在那里之前,我尝试在退出按钮ActionListener中的actionPerformed()中设置文本(“Good Bye”)。 但文字没有改变。 最终我意识到我的标签没有得到更新,因为我在匿名的ActionListener类中处理框架。 在我让代码离开ActionListener.actionPerformed()之后,标签文本得到了更新。 我必须在新线程中处理我的JFrame,以确保完成1. actionPerformed,以便主线程从匿名嵌套类返回并更新主类中的标签。 2.启动一个新线程,等待一秒钟以允许读取“再见”。 3.这个新线程配置框架。

repaint()在这里不起作用。

只需给出label_name.paintImmediately(label_name.getVisibleRect());

它会马上更新