Swing Jframe Jpanel-窗口打开时显示结果

Swing Jframe Jpanel-窗口打开时显示结果,swing,jframe,jpanel,Swing,Jframe,Jpanel,我正在尝试使用Jframe在窗口应用程序中显示客户端详细信息。一切正常,只是客户端需要等到进程完成后才能在窗口(Jframe)中显示结果 在设置Jframe.setVisible(true)之后,是否有一种方法动态显示结果(Jpanel.add()) 注意:我不熟悉此代码 我试过的代码: JFrame frame = new JFrame(); frame.addWindowListener(new WindowAdapter() { pu

我正在尝试使用Jframe在窗口应用程序中显示客户端详细信息。一切正常,只是客户端需要等到进程完成后才能在窗口(Jframe)中显示结果

在设置Jframe.setVisible(true)之后,是否有一种方法动态显示结果(Jpanel.add())

注意:我不熟悉此代码

我试过的代码:

        JFrame frame = new JFrame();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }});
        JPanel panel = new JPanel();
        frame.setVisible(true);
        int y=100;
        for (int i = 0; i < 10; i++) {
            //connecting DB and fetching data #single loop may take 5 secs to complete the process
            panel.add(new JLabel("Client"+i)).setBounds(50,y, 100, 30); //after added, this should display in opened window
            y=y+20;
            //connecting DB and fetching data
            for(int clinetDetails=0;clinetDetails< 3;clinetDetails++) {
                panel.add(new JLabel("ClientDetails"+clinetDetails)).setBounds(50,y, 100, 30);
                y=y+20;
            }
            panel.add(new JLabel("Client :"+i+" Completed")).setBounds(50,y, 100, 30);
            y=y+20;
//          frame.pack();

        }
        panel.setLayout(new GridLayout(0, 1));

        JScrollPane scrollPane = new JScrollPane(panel);
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
        frame.setPreferredSize(new Dimension(300, 300));
        frame.pack();
JFrame=newjframe();
frame.addWindowListener(新的WindowAdapter(){
公共无效窗口关闭(WindowEvent e){
系统出口(0);
}});
JPanel面板=新的JPanel();
frame.setVisible(true);
int y=100;
对于(int i=0;i<10;i++){
//连接数据库和获取数据#单个循环可能需要5秒才能完成此过程
panel.add(new JLabel(“Client”+i)).setBounds(50,y,100,30);//添加后,应在打开的窗口中显示
y=y+20;
//连接数据库并获取数据
for(int clinetDetails=0;clinetDetails<3;clinetDetails++){
添加(新的JLabel(“客户详细信息”+clinetDetails)).setBounds(50,y,100,30);
y=y+20;
}
面板。添加(新的JLabel(“客户:+i+”已完成”)。立根(50,y,100,30);
y=y+20;
//frame.pack();
}
panel.setLayout(新的GridLayout(0,1));
JScrollPane scrollPane=新的JScrollPane(面板);
frame.getContentPane().setLayout(新的BorderLayout());
frame.getContentPane().add(滚动窗格,BorderLayout.CENTER);
frame.setPreferredSize(新尺寸(300300));
frame.pack();

您可能应该使用SwingWorker,但这会给您一个想法

首先,您应该在EDT上执行swing工作,因此我们从创建GUI开始

static public void main(String[] args){
     EventQueue.invokeLater( ()->createGui());
}

static public void createGui(){
      JFrame frame = new JFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel panel = new JPanel();
      frame.setVisible(true);


    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

    JScrollPane scrollPane = new JScrollPane(panel);
    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
    frame.setPreferredSize(new Dimension(300, 300));
    frame.pack();

    Runnable r = ()->{
        for (int i = 0; i < 10; i++) {
        //connecting DB and fetching data #single loop may take 5 secs to complete the process     //all of the swing work should be done on the EDT.
            final String clientName = "Client"+i;
            EventQueue.invokeLater( ()->{
                panel.add(new JLabel( clientName ));
            } );
            //connecting DB and fetching data
            for(int clinetDetails=0;clinetDetails< 3;clinetDetails++) {
                    String clientD = "ClientDetails "+clinetDetails;
                    EventQueue.invokeLater( ()->{
                       panel.add(new JLabel(clientD));
                       panel.add(new JLabel( clientName + " Completed" ) );                     
                    });
             }
        }
    };
    new Thread(r).start(); //starts the working thread.
}
static public void main(字符串[]args){
invokeLater(()->createGui());
}
静态公共void createGui(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel面板=新的JPanel();
frame.setVisible(true);
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
JScrollPane scrollPane=新的JScrollPane(面板);
frame.getContentPane().setLayout(新的BorderLayout());
frame.getContentPane().add(滚动窗格,BorderLayout.CENTER);
frame.setPreferredSize(新尺寸(300300));
frame.pack();
可运行r=()->{
对于(int i=0;i<10;i++){
//连接数据库和获取数据#单个循环可能需要5秒来完成此过程//所有的摆动工作都应在EDT上完成。
最终字符串clientName=“Client”+i;
EventQueue.invokeLater(()->{
添加(新JLabel(clientName));
} );
//连接数据库并获取数据
for(int clinetDetails=0;clinetDetails<3;clinetDetails++){
字符串clientD=“ClientDetails”+clinetDetails;
EventQueue.invokeLater(()->{
添加(新的JLabel(clientD));
添加(新JLabel(clientName+“已完成”);
});
}
}
};
新线程(r).start();//启动工作线程。
}

这将启动一个gui,然后当新线程启动时,您将释放edt,以便java可以显示您的gui,然后在生成新信息时,它将通过向edt发送偶数来更新gui。

等待时您希望显示什么?为什么要使用网格布局?在循环中处理client2细节之前,client1细节应该一直显示。同样,每个客户端都要逐个显示详细信息one@MMMMS我通过删除
setBounds
调用,而不是使用方框布局,对其进行了一些清理,并在lamda表达式之外创建了标签。我不确定现在编译还会有什么错误。语法错误,请在新线程(r.start())处插入“;”以完成LocalVariableDeclarationStatement//启动工作线程。 } here@MMMMS它现在可以编译了。