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
时,是否有任何特定部分可能会导致此问题?不,它不是-它从来没有出现过,尽管记录不正确(阅读:这是一个文档错误!)在早期版本中也是如此否,它不是-它从来没有出现过,尽管记录不正确(阅读:这是一个文档错误!)在早期版本中也是如此