Java 为什么循环禁用其他按钮或swing组件?

Java 为什么循环禁用其他按钮或swing组件?,java,netbeans,Java,Netbeans,当我按下一个包含for循环事件的jbutton时,其他组件被禁用 以下是我的jbutton中的代码: try{ InetAddress localhost = InetAddress.getLocalHost(); byte[] ip = localhost.getAddress(); for(int i=1;i<254;i++){ ip[3]=(byte)i; final InetA

当我按下一个包含for循环事件的jbutton时,其他组件被禁用

以下是我的jbutton中的代码:

    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();
    }
试试看{
InetAddress localhost=InetAddress.getLocalHost();
字节[]ip=localhost.getAddress();

对于(inti=1;i来说,所谓“禁用”大概是指他们变得无反应

发生这种情况是因为您正在中执行非常昂贵/长期的操作,该操作处理所有与GUI相关的操作,如重新绘制组件。当您的代码阻塞此线程时,Swing无法快速执行常规操作,UI将对用户操作不响应,并且可能会出现绘制或绘制操作r延迟/冻结

您应该生成一个新线程来完成繁重的工作并报告结果。Swing提供的类可以帮助您完成所需的工作

快速脏代码:

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();
}
试试看{
InetAddress localhost=InetAddress.getLocalHost();
最后一个字节[]ip=localhost.getAddress();
SwingWorker worker=新SwingWorker()
{
公共列表模型doInBackground()
{

对于(int i=1;i您不能在事件处理程序内进行任何实质性的计算,因为当您的处理程序运行时,所有其他组件都不可访问,并且无法重新绘制屏幕。您必须创建一个新线程并在其中进行处理。

将您的循环添加到线程,并在单击按钮后启动线程。当前,按钮事件已满足hod被阻止,循环无法完成。

不客气:)请注意,我没有测试/运行建议的代码,因此如果您有问题,请发回!我在“公共作废进程(列表地址)”线程中遇到问题它说对列表的引用是不明确的,java.util中的接口java.util.List和java.awt中的类java.awt.List都是匹配的。这是什么意思?再次感谢……这意味着编译器无法清楚地识别要使用的
List
类/接口。通过将
import java.util.List;
添加到导入语句中(它应该位于.java文件的顶部,在
语句之后),您告诉编译器当您使用名称
列表
时,您指的是
java.util.List
。(如果您添加
import java.awt.List
List
将引用
java.awt.List
。添加两者将使您回到原点,因为在使用
List
时无法消除这两种可能性之间的歧义)哇,这很酷,你是个天才:),再次感谢您不擅长编码。问题解决。
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();
}