我正在尝试使用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());
}
}
答案 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放在新线程中,以确保:
actionPerformed
已完成,主线程从匿名嵌套类返回并更新主类中的标签。
启动新线程,等待一秒钟,以便阅读“再见”。
答案 4 :(得分:1)
repaint()
在这里工作不了。
只需使用label_name.paintImmediately(label_name.getVisibleRect());
它会立即更新。