Бутоните не се показват на Frame, докато се чака процесът да завърши в 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 и да използва някакъв вид Образец на наблюдател за получаване на резултати от Process

Нещо като това например или дори това например.

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

person MadProgrammer    schedule 09.04.2015