在动作侦听器中刷新JFrame

时间:2013-08-30 18:21:39

标签: java swing actionlistener repaint

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

我之前从未遇到过这个问题,可能是因为我在动作监听器的单次触发中从未发生过几件事。我错过了什么?

TL; DR为什么以下内容不会更新屏幕上的文字,直到它完成触发动作侦听器,即使我在每个listPanel.add()之后放入了repaint()?

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添加面板了。我不确定是什么导致了这一点。

1 个答案:

答案 0 :(得分:3)

动作监听器正在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的一些信息。