Кнопки не отображаются во фрейме во время ожидания завершения процесса в JAVA

//Рамка стала видимой, но кнопки на ней не отображаются. ProcessBuilder для выполнения a.sh и нам нужно дождаться завершения этого процесса. Вызов showFrame() отображает кадры без кнопки и меток, но как только процесс завершается, полный кадр становится видимым.

    showFrame();
            Process test=null;
            try {
                test = new ProcessBuilder("sh" ,"config/a.sh").start(); 

                test.waitFor();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
   }
        private void showFrame() {
            JFrame fr = new JFrame("Operations");
            fr.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            fr.setBounds(100,100,600,500);
            fr.setSize(500, 500);
            JButton b1 = new JButton("PORT30");
            JLabel l1 = new JLabel("TRACKER");
            l1.setBounds(100,70,100,100);
            fr.setLayout(null);
            JLabel l2 = new JLabel("NODE");
            l2.setBounds(100,170,100,100);
            b1.setBounds(300,100,160,50);
            JButton b2 = new JButton("PORT70");
            b2.setBounds(300,200,160,50);
            fr.add(b1);
            fr.add(b2);
            fr.add(l2);
            fr.add(l1);
            fr.setVisible(true);
            l1.setVisible(true);
            l2.setVisible(true);
            b1.setVisible(true);
            b2.setVisible(true);

person Lalit Lakhotia    schedule 09.04.2015    source источник
comment
вам не нужно устанавливать visible true для кнопок, метки они видны по умолчанию   -  person Madhawa Priyashantha    schedule 09.04.2015


Ответы (1)


test.waitFor(); — это блокирующий вызов, если он выполняется из контекста потока диспетчеризации событий, это предотвратит обновление пользовательского интерфейса, поскольку он не может обрабатывать события в очереди событий.

Swing является однопоточным, что означает, что все, что блокирует EDT, не позволит ему обрабатывать новые события из очереди событий, а также не является потокобезопасным, что означает, что вы никогда не должны обновлять или изменять пользовательский интерфейс из любого другого потока, кроме EDT.

Дополнительные сведения см. в разделе Параллелизм в Swing.

Решением было бы позволить Process выполняться внутри его собственного Thread и использовать некий шаблон Observer для получения результатов Process

Что-то вроде это например или даже < например, href="https://stackoverflow.com/questions/15801069/printing-a-java-inputstream-from-a-process/15801490#15801490">это.

Избегайте использования макетов null, макеты с точностью до пикселя — это иллюзия в современном дизайне пользовательского интерфейса. Существует слишком много факторов, влияющих на размер отдельных компонентов, и ни один из них вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в основе, отказ от них приведет к бесконечным проблемам и проблемам, которые вы будете тратить все больше и больше времени, пытаясь исправить

person MadProgrammer    schedule 09.04.2015