gpt4 book ai didi

java - Swing ProgressMonitor 不工作

转载 作者:行者123 更新时间:2023-12-02 06:40:01 24 4
gpt4 key购买 nike

我正在尝试学习 Java Swing 中的 ProgressMonitor。我创建了这个简单的测试代码 -

public class ProgressMonitorTest extends JFrame 
{
private JPanel contentPane;
private ProgressMonitor progressMonitor;
private JButton button;
private static ProgressMonitorTest frame;
private static boolean isFrameReady;

public JButton getButton()
{
return button;
}

public ProgressMonitor getProgressMonitor()
{
return progressMonitor;
}

/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
frame = new ProgressMonitorTest();
frame.setVisible(true);
isFrameReady = true;
}
catch (Exception e)
{
e.printStackTrace();
}
}
});

while(!isFrameReady)
{
//
}

frame.getButton().addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
for(int i=0;i<=10;i++)
{
final int percent = i;
SwingUtilities.invokeAndWait(new Runnable()
{
@Override
public void run()
{
frame.getProgressMonitor().setProgress(percent * 10);
frame.getProgressMonitor().setNote("Completed " + percent*10 + "%.");
}
});
try
{
Thread.sleep(1000);
}
catch(Exception ee)
{
//
}
}
}
catch(Exception es)
{
//
}
}
});
}

/**
* Create the frame.
*/
public ProgressMonitorTest()
{
isFrameReady = false;

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
setTitle("Progress Monitor");

contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));

progressMonitor = new ProgressMonitor(frame, "Update in progress...", "", 0, 10);
button = new JButton("Click Here");
contentPane.add(button);

setContentPane(contentPane);
}

}

与此相关的几个问题-

  1. 如果我删除 isFrameReady 检查,程序会在我分配按钮的操作监听器的行处显示 NullPointerException

  2. 如果我保留上述检查,则单击按钮不会执行任何操作。

  3. 保持上述检查,然后进行调试,我让它等待一段时间,然后才到达 Action 监听器所在的行。在这种情况下,它可以工作,但立即退出,说它无法从事件处理线程调用 invokeAndWait

我在这一切中错过了什么?有人可以解释一下如何让它发挥作用吗?

最佳答案

If I remove the isFrameReady check, the program says a NullPointerException at the line where I assign the button's action listener.

使用isFrameReady可确保您已成功创建框架。在您的 main 中,使用调用 EventQueue.invokeLater(new Runnable(){}) 向事件调度线程 (EDT) 发送请求:删除检查 isFrameReady,您将在主线程中调用 frame.getButton(),但 frame 尚未由 frame = new ProgressMonitorTest(); 创建 在 EDT 中,因此发生 NullPointerException

If I keep the above check, then clicking on the button does nothing.

现在你应该明白了,上面的检查与按钮点击无关。该按钮没有执行任何操作,因为 GUI 因违反 swing 的单线程规则而被卡住。将 actionPerformed 方法的增量 for 循环放入另一个线程中,如以下代码片段所示,并从那里执行它。你会发现它工作得很好。

 new Thread(){
public void run()
{
for(int i=0; i<10; i++)
{
//whatever you were doing.
}
}
}.start();

Keeping the above check and then debugging this, I let it wait for some time before it gets to the line where the action listener. In this case, it works but immediately quits saying it can't call invokeAndWait from the event handling thread.

SwingUtitlies.invokeAndWait() 阻塞当前线程并等待,直到 EDT 完成执行给它的任务。由于 actionPerformed() 函数已在 EDT 内运行,因此从当前线程:EDT 调用 SwingUtitlies.invokeAndWait() 会阻塞当前线程:EDT,这是不允许的。在这种情况下,请勿使用 invokeAndWait。您应该改为调用 SwingUtilities.invokeLater()

但是,在您了解 Swing 线程模型之前,我认为您不会得到任何东西。阅读 javadoc 和一些互联网资源。一定要阅读《Filthy Rich Clients》一书,并尝试书中提供的示例:您将比任何其他资源更深入地了解图形效果。

关于java - Swing ProgressMonitor 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19230449/

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