Почему петля отключена другими кнопками или компонентами качания? - PullRequest
0 голосов
/ 15 апреля 2011

Когда я нажал кнопку j с событием цикла внутри, другие компоненты стали недоступны.

Вот код, который я получил от моей кнопки:

    try{
        InetAddress localhost = InetAddress.getLocalHost();
        byte[] ip = localhost.getAddress();

        for(int i=1;i<254;i++){
            ip[3]=(byte)i;
            final InetAddress address = InetAddress.getByAddress(ip);

            if(address.isReachable(1000)){
                listModel1.addElement(address);
                System.out.println(address + "-Machine is turned on and can be ping.");
                Rectangle progressRec = jProgressBar1.getBounds();
                progressRec.x = 0;
                progressRec.y = 0;
                jProgressBar1.setValue(i);
                jProgressBar1.paintImmediately(progressRec);
            }
        }
        jList1.setModel(listModel1);
    }catch(Exception e){
        e.printStackTrace();
    }

Тогда после завершения цикла другие компоненты стали активными? Как мне с этим бороться? Заранее спасибо ...

Отредактированные коды: не рекомендуется кодировать

    try{
        InetAddress localhost = InetAddress.getLocalHost();
        final byte[] ip = localhost.getAddress();

        SwingWorker<ListModel, InetAddress> worker = new SwingWorker<ListModel, InetAddress>(){
            public ListModel doInBackground() throws UnknownHostException, IOException{
                for(int i=1;i<254;i++){
                    ip[3]=(byte)i;
                    final InetAddress address = InetAddress.getByAddress(ip);

                    if(address.isReachable(1000)){
                        publish(address);
                        listModel1.addElement(address);
                        Rectangle progressRec = jProgressBar1.getBounds();
                        progressRec.x = 0;
                        progressRec.y = 0;
                        jProgressBar1.setValue(i);
                        jProgressBar1.paintImmediately(progressRec);
                    }
                }
                return listModel1;
            }

            @Override
            public void process(List<InetAddress> addresses){//there was a problem here.
                for(InetAddress address : addresses){
                    System.out.println(address + "-Machine is turned on and can be ping.");
                }
            }

            @Override
             public void done(){
                try {
                    jList1.setModel(get());
                } catch (InterruptedException ex) {
                    Logger.getLogger(NetCafeTime.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ExecutionException ex) {
                    Logger.getLogger(NetCafeTime.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
         };
         worker.execute();
    }catch(Exception e){
        e.printStackTrace();
    }

Ответы [ 3 ]

5 голосов
/ 15 апреля 2011

Предположительно, под "инвалидом" вы подразумеваете, что они перестают отвечать.

Это происходит потому, что вы выполняете очень дорогие / долгоживущие операции в потоке Event Dispatch , который обрабатывает все связанные с графическим интерфейсом действия, такие как перерисовка компонентов. Когда ваш код блокирует этот поток, Swing не может быстро выполнять обычные операции, и пользовательский интерфейс перестает отвечать на действия пользователя, а рисование или рисование могут также зависать / зависать.

Вы должны создать новую ветку, чтобы выполнить тяжелую работу и сообщить о результатах. Swing предоставляет класс SwingWorker , который может помочь вам сделать то, что вы хотите.

Быстрый и грязный код:

try{
    InetAddress localhost = InetAddress.getLocalHost();
    final byte[] ip = localhost.getAddress();

    SwingWorker<ListModel, InetAddress> worker = new SwingWorker<ListModel, InetAddress>()
    {
        public ListModel doInBackground()
        {
            for(int i=1;i<254;i++){
                ip[3]=(byte)i;
                final InetAddress address = InetAddress.getByAddress(ip);

                if(address.isReachable(1000)){
                    publish(address);
                    listModel1.addElement(address);
                }
            }

            return listModel1;
        }

        public void process(List<InetAddress> addresses)
        {
            for(InetAddress address : addresses)
            {
                System.out.println(address + "-Machine is turned on and can be ping.");
                Rectangle progressRec = jProgressBar1.getBounds();
                progressRec.x = 0;
                progressRec.y = 0;
                jProgressBar1.setValue(i);
                jProgressBar1.paintImmediately(progressRec);
            }
        }

        public void done()
        {
            jList1.setModel(get());
        }
    };

    worker.execute();

}catch(Exception e){
    e.printStackTrace();
}

Рекомендуемое чтение:

2 голосов
/ 15 апреля 2011

Добавьте ваш цикл в поток и запустите поток после нажатия кнопки В настоящее время метод события кнопки заблокирован циклом для завершения.

2 голосов
/ 15 апреля 2011

Вы не можете выполнять какие-либо существенные вычисления внутри обработчика событий, потому что во время работы вашего обработчика все остальные компоненты недоступны и экран не может быть перекрашен.Вы должны создать новый поток и выполнить в нем обработку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...