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

问题描述 投票:0回答:1

我正在尝试使用Jframe在窗口应用程序中显示客户端详细信息。一切都很好,除了客户端需要等待该过程完成才能在window(Jframe)中显示结果。

设置Jframe.setVisible(true)之后,有没有一种动态显示result(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();
swing jframe jpanel
1个回答
0
投票
首先,您应该在EDT上进行摇摆工作,所以我们首先创建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. }

这将启动gui,然后在新线程启动时,您将释放edt,以便java可以显示您的gui,然后在产生新信息时,它通过将偶数发布到EDT来更新gui。

© www.soinside.com 2019 - 2024. All rights reserved.