gpt4 book ai didi

java - 在 Action Listener 中刷新 JFrame

转载 作者:行者123 更新时间:2023-11-29 05:38:41 25 4
gpt4 key购买 nike

下面的代码片段在 JLabel 中设置文本,该文本被添加到附加到 JFrame 的 JPanel 中。不管我做什么(例如 repaint()、revalidate() 等),在 Action Listener 完成之前,我都无法让 UI 更新文本。

我以前从未遇到过这个问题,这可能是因为我从来没有在一次触发 Action Listener 时发生过几件事。我错过了什么?

TL;DR 为什么即使我在每个 listPanel.add() 之后放入 repaint() 之后,下面的代码在完成触发 Action Listener 之前也不会更新屏幕上的文本?

final JFrame guiFrame = new JFrame();
final JPanel listPanel = new JPanel();
listPanel.setVisible(true);
final JLabel listLbl = new JLabel("Welcome");
listPanel.add(listLbl);

startStopButton.addActionListener(new ActionListener(){@Override public void actionPerformed(ActionEvent event){
if(startStopButton.getText()=="Start"){
startStopButton.setVisible(false);
listPanel.remove(0);

JLabel listLbl2 = new JLabel("Could not contact”);
listPanel.add(listLbl2);

JLabel listLbl2 = new JLabel("Success”);
listPanel.add(listLbl2);
}
}
guiFrame.setResizable(false);
guiFrame.add(listPanel, BorderLayout.LINE_START);
guiFrame.add(startStopButton, BorderLayout.PAGE_END);

//make sure the JFrame is visible
guiFrame.setVisible(true);

编辑:我试图实现 SwingWorker,但在操作界面完成触发之前界面仍然不会更新。这是我的 SwingWorker 代码:

@Override
protected Integer doInBackground() throws Exception{
//Downloads and unzips the first video.
if(cameraBoolean==true)
panel.add(this.downloadRecording(camera, recording));
else
panel.add(new JLabel("Could not contact camera "+camera.getName()));

panel.repaint();
jframe.repaint();
return 1;
}

private JLabel downloadRecording(Camera camera, Recording recording){
//does a bunch of calculations and returns a jLabel, and works correctly
}

protected void done(){
try{
Date currentTime = new Timestamp(Calendar.getInstance().getTime().getTime());
JOptionPane.showMessageDialog(jframe, "Camera "+camera.getName()+" finished downloading at "+currentTime.getTime());
}catch (Exception e){
e.printStackTrace();
}
}

基本上,SwingWorker(正如我实现的那样)没有正确更新 JPanel 和 JFrame。如果我尝试在“done()”中重绘,它们也不会更新。我错过了什么?

此外,一旦 JOptionPane 显示自身,就不能再向我的 jframe 添加面板。我也不确定是什么原因造成的。

最佳答案

Action 监听器正在 Event Dispatch Thread 上执行.对于这样的任务,请考虑使用 SwingWorker .

这将允许您在不阻塞 JFrame 的更新(以及重绘)的情况下处理您的逻辑。

在高层次上,这就是我的意思:

startStopButton.addActionListener(new ActionListener(){@Override public void         actionPerformed(ActionEvent event){
if(startStopButton.getText()=="Start"){
// Start SwingWorker to perform whatever is supposed to happen here.
}

您可以找到一些关于如何使用 SwingWorker 的信息 here , 如果你需要的话。

关于java - 在 Action Listener 中刷新 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18539208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com