Java JFrame上的显示延迟
我编写了一个程序,显示一个Java JFrame上的显示延迟,java,swing,jframe,Java,Swing,Jframe,我编写了一个程序,显示一个JFrame,其中包含关于运行它的机器的信息(HOST和IP),它通过JDBC连接来显示另一个信息 我的main函数中只有这两行: NewFrame nf = new NewFrame(); //Here I make all the needed calculations nf.setVisible(true); (新框架扩展了JFrame) 在构造函数中,我执行所有需要的计算,并将它们设置为显示在nf JFrame中 当我运行程序时,我会看到JFrame的边框,持
JFrame
,其中包含关于运行它的机器的信息(HOST
和IP
),它通过JDBC
连接来显示另一个信息
我的main
函数中只有这两行:
NewFrame nf = new NewFrame(); //Here I make all the needed calculations
nf.setVisible(true);
(新框架扩展了JFrame)
在构造函数中,我执行所有需要的计算,并将它们设置为显示在nf JFrame
中
当我运行程序时,我会看到JFrame
的边框,持续0.5-1秒,直到它被信息填满,尽管我将其设置为只有在构建之后才可见
这是我在1秒钟内看到的:(里面是我的桌面背景)
然后我看到了信息:
尽管我在构造函数中进行了所有计算,但为什么会发生这种情况?听起来像是在阻止事件调度线程(EDT) 应避免在EDT上运行任何可能阻塞或耗时的操作。这将防止EDT调度重绘事件,这是一种重要的事件 你可能想看看
处理Swing和线程时的一个重要规则是,只能从EDT内部与Swing组件进行交互听起来像是在阻止事件调度线程(EDT) 应避免在EDT上运行任何可能阻塞或耗时的操作。这将防止EDT调度重绘事件,这是一种重要的事件 你可能想看看
处理Swing和线程时的一个重要规则是,您必须仅从EDT内部与Swing组件交互看起来您在GUI线程中同步执行了一些阻塞调用,即数据库查询。您应该使用
SwingWorker
异步执行这些操作:
final JTextField field = new JTextField ();
field.setEditable (false);
JButton button = new JButton(new AbstractAction ("Calculate!") {
@Override
public void actionPerformed(ActionEvent e) {
field.setText ("Calculating...");
new SwingWorker<String, String> ()
{
@Override
protected String doInBackground() throws Exception {
Thread.sleep(3000L);
field.setText ("Calculated!");
return null;
}
}.execute();
}
});
JFrame frame = new JFrame ();
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane ().setLayout (new BorderLayout());
frame.getContentPane ().add (button, BorderLayout.NORTH);
frame.getContentPane ().add (field, BorderLayout.CENTER);
frame.pack ();
frame.setVisible (true);
final JTextField=new JTextField();
field.setEditable(false);
JButton button=newjbutton(新抽象操作(“计算!”){
@凌驾
已执行的公共无效操作(操作事件e){
field.setText(“计算…”);
新SwingWorker()
{
@凌驾
受保护的字符串doInBackground()引发异常{
线程。睡眠(3000L);
field.setText(“计算的!”);
返回null;
}
}.execute();
}
});
JFrame=newjframe();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(新的BorderLayout());
frame.getContentPane().add(按钮,BorderLayout.NORTH);
frame.getContentPane().add(字段,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
看起来您在GUI线程中同步执行了一些阻塞调用,即数据库查询。您应该使用SwingWorker
异步执行这些操作:
final JTextField field = new JTextField ();
field.setEditable (false);
JButton button = new JButton(new AbstractAction ("Calculate!") {
@Override
public void actionPerformed(ActionEvent e) {
field.setText ("Calculating...");
new SwingWorker<String, String> ()
{
@Override
protected String doInBackground() throws Exception {
Thread.sleep(3000L);
field.setText ("Calculated!");
return null;
}
}.execute();
}
});
JFrame frame = new JFrame ();
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane ().setLayout (new BorderLayout());
frame.getContentPane ().add (button, BorderLayout.NORTH);
frame.getContentPane ().add (field, BorderLayout.CENTER);
frame.pack ();
frame.setVisible (true);
final JTextField=new JTextField();
field.setEditable(false);
JButton button=newjbutton(新抽象操作(“计算!”){
@凌驾
已执行的公共无效操作(操作事件e){
field.setText(“计算…”);
新SwingWorker()
{
@凌驾
受保护的字符串doInBackground()引发异常{
线程。睡眠(3000L);
field.setText(“计算的!”);
返回null;
}
}.execute();
}
});
JFrame=newjframe();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(新的BorderLayout());
frame.getContentPane().add(按钮,BorderLayout.NORTH);
frame.getContentPane().add(字段,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
在此处发布您的代码。显然有点问题,大约有500行代码。。将数据分配给JFrame
时,是否有任何特定部分可能导致此问题?请将代码张贴在此处。显然有点问题,大约有500行代码。。在将数据分配给JFrame
时,是否有任何特定部分可能会导致此问题?不,它不是-它从来没有出现过,尽管记录不正确(阅读:这是一个文档错误!)在早期版本中也是如此否,它不是-它从来没有出现过,尽管记录不正确(阅读:这是一个文档错误!)在早期版本中也是如此