2012-04-12 154 views
2

我想通过使用setText()方法更新JLabel。但我无法重绘JLabel。我必须使用repaint()方法来做到这一点吗?我搜索了每个论坛,但我找不到解决方案。JLabel setText不起作用

这是代码的一部分。我没有得到任何错误,但它没有更新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()); 
    } 
} 
+2

我会先说jLabel无法显示换行符。用包装它并使用
标签。 – MarioDS 2012-04-12 22:40:37

+0

您确定在将* log添加到布局管理器之后,您没有将'log'变量重新初始化为新的'JLabel'实例? – Danish 2012-04-12 22:45:10

+0

是的,实际上我用构造函数初始化它。 – Isuru 2012-04-12 22:50:12

回答

2

我有点难以理解在Java中如何重新绘制框架/组件。你可以Paint(Graphics g)update(Graphics g)哪个根据javadoc只叫paint(g)。最后还有repaint() ...

如果这些看起来都不起作用,那么仅仅在您正在尝试设置文本的行上创建标签不会更容易吗?

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

+0

你对JLabel不允许简单的新行和使用JTextArea的看法是正确的。 1+。 – 2012-04-12 22:57:19

9

JLabel不需要重新打电话。只需调用setText(...)将更改标签的文本,这就是所需的全部内容。

我不知道你的问题是否是一个并发问题,你在Swing事件线程上做了一个长期运行的过程,并且这阻止了你的标签更新它的文本。

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

欲了解更多信息,请查看Lesson: Concurrency in Swing教程。

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

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

} 
} 
2

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