简体   繁体   English

Java程序挂起

[英]Java program is hanging

I wrote a program that accepts numbers and generates a table depending on the number of numbers inputted. 我编写了一个接受数字并根据输入的数字生成表格的程序。 The program is working fine up to 4 numbers but when I try the same program with 5, the program hangs. 该程序最多可以正常运行4个数字,但是当我尝试将5与同一个程序时,该程序将挂起。 A screenshot of the JFrame. JFrame的屏幕截图。

http://i.imgur.com/pXuYCol.png (I don't have enough reputation to post images.) http://i.imgur.com/pXuYCol.png (我没有足够的声誉来发布图像。)

The button stays pressed but the next part of the program doesn't get executed, and I can't click any other button, nor can I close the window. 该按钮保持按下状态,但是程序的下一部分没有执行,并且我无法单击任何其他按钮,也无法关闭该窗口。

Any idea why this is happening and how it can be avoided? 知道为什么会发生这种情况以及如何避免这种情况吗?

EDIT: This is the method that is supposed to be executed when the button is pressed. 编辑:这是应该在按下按钮时执行的方法。

public void punnett5(final List<String> fin){
    JFrame gamFrame = new JFrame();

    Object row[][] = {};
    Object column[] = {};
    final DefaultTableModel model = new DefaultTableModel(row, column);

    JTable punnett = new JTable(model);

    for (int b = 0; b < 32; b ++){
        model.addColumn("");
    }

    String a1 = "", a2 = "", a3 = "", a4 = "", a5 = "";
    String[] rowData = new String[32];
    int a = 0, first = 0, second = 0, finale = 0;

    for(int b = 11111; b <= 22222; b += 10000){
        for(int c = b; c <= (Integer.parseInt(String.valueOf(c).substring(0,1)) * 10000) + 2222; c += 1000){
            for(int d = c; d <= (Integer.parseInt(String.valueOf(d).substring(0,1)) * 10000) +
                    (Integer.parseInt(String.valueOf(d).substring(1,2)) * 1000) + 222; d += 100){
                for(int e = d; e <= (Integer.parseInt(String.valueOf(e).substring(0,1)) * 10000) +
                        (Integer.parseInt(String.valueOf(e).substring(1,2)) * 1000) +
                        (Integer.parseInt(String.valueOf(e).substring(2,3)) * 100) + 22; d += 10){
                    for(int f = e; f <= (Integer.parseInt(String.valueOf(f).substring(0,1)) * 10000) +
                            (Integer.parseInt(String.valueOf(f).substring(1,2)) * 1000) +
                            (Integer.parseInt(String.valueOf(f).substring(2,3)) * 100)
                            + (Integer.parseInt(String.valueOf(f).substring(3,4)) * 10) + 2; d ++){
                        a = 0;
                        first = (Integer.parseInt(String.valueOf(f).substring(0,1)) * 1000000000) +
                                (Integer.parseInt(String.valueOf(f).substring(1,2)) * 10000000) +
                                (Integer.parseInt(String.valueOf(f).substring(2,3)) * 100000) +
                                (Integer.parseInt(String.valueOf(f).substring(3,4)) * 1000) +
                                (Integer.parseInt(String.valueOf(f).substring(4,5)) * 10);
                        for(int g = 11111; g <= 22222; g += 10000){
                            for(int h = g; h <= (Integer.parseInt(String.valueOf(h).substring(0,1)) * 10000) + 2222; h += 1000){
                                for(int i = h; i <= (Integer.parseInt(String.valueOf(i).substring(0,1)) * 10000) +
                                        (Integer.parseInt(String.valueOf(i).substring(1,2)) * 1000) + 222; i += 100){
                                    for(int j = i; j <= (Integer.parseInt(String.valueOf(j).substring(0,1)) * 10000) +
                                            (Integer.parseInt(String.valueOf(j).substring(1,2)) * 1000) +
                                            (Integer.parseInt(String.valueOf(j).substring(2,3)) * 100) + 22; j += 10){
                                        for(int k = j; k <= (Integer.parseInt(String.valueOf(k).substring(0,1)) * 10000) +
                                                (Integer.parseInt(String.valueOf(k).substring(1,2)) * 1000) +
                                                (Integer.parseInt(String.valueOf(k).substring(2,3)) * 100)
                                                + (Integer.parseInt(String.valueOf(k).substring(3,4)) * 10) + 2; k ++){
                                            second = (Integer.parseInt(String.valueOf(k).substring(0,1)) * 100000000) +
                                                    (Integer.parseInt(String.valueOf(k).substring(1,2)) * 1000000) +
                                                    (Integer.parseInt(String.valueOf(k).substring(2,3)) * 10000) +
                                                    (Integer.parseInt(String.valueOf(k).substring(3,4)) * 100) +
                                                    (Integer.parseInt(String.valueOf(k).substring(4,5)));

                                            finale = first + second;

                                            if ((Integer.parseInt(String.valueOf(finale).substring(0,2))) == 11){
                                                a1 = (fin.get(0) + fin.get(0)).toUpperCase();
                                            }
                                            if((Integer.parseInt(String.valueOf(finale).substring(0,2))) == 12 ||
                                                    (Integer.parseInt(String.valueOf(finale).substring(2,4))) == 21){
                                                a1 = fin.get(0) + fin.get(0).toLowerCase();
                                            }
                                            if ((Integer.parseInt(String.valueOf(finale).substring(0,2))) == 22){
                                                a1 = (fin.get(0) + fin.get(0)).toLowerCase();
                                            }

                                            if ((Integer.parseInt(String.valueOf(finale).substring(2,4))) == 11){
                                                a2 = (fin.get(1) + fin.get(1)).toUpperCase();
                                            }
                                            if((Integer.parseInt(String.valueOf(finale).substring(2,4))) == 12 ||
                                                    (Integer.parseInt(String.valueOf(finale).substring(2,4))) == 21){
                                                a2 = fin.get(1) + fin.get(1).toLowerCase();
                                            }
                                            if ((Integer.parseInt(String.valueOf(finale).substring(2,4))) == 22){
                                                a2 = (fin.get(1) + fin.get(1)).toLowerCase();
                                            }

                                            if ((Integer.parseInt(String.valueOf(finale).substring(4,6))) == 11){
                                                a3 = (fin.get(2) + fin.get(2)).toUpperCase();
                                            }
                                            if((Integer.parseInt(String.valueOf(finale).substring(4,6))) == 12 ||
                                                    (Integer.parseInt(String.valueOf(finale).substring(4,6))) == 21){
                                                a3 = fin.get(2) + fin.get(2).toLowerCase();
                                            }
                                            if ((Integer.parseInt(String.valueOf(finale).substring(4,6))) == 22){
                                                a3 = (fin.get(2) + fin.get(2)).toLowerCase();
                                            }

                                            if ((Integer.parseInt(String.valueOf(finale).substring(6,8))) == 11){
                                                a4 = (fin.get(3) + fin.get(3)).toUpperCase();
                                            }
                                            if((Integer.parseInt(String.valueOf(finale).substring(6,8))) == 12 ||
                                                    (Integer.parseInt(String.valueOf(finale).substring(6,8))) == 21){
                                                a4 = fin.get(3) + fin.get(3).toLowerCase();
                                            }
                                            if ((Integer.parseInt(String.valueOf(finale).substring(6,8))) == 22){
                                                a4 = (fin.get(3) + fin.get(3)).toLowerCase();
                                            }

                                            if ((Integer.parseInt(String.valueOf(finale).substring(8,10))) == 11){
                                                a5 = (fin.get(4) + fin.get(4)).toUpperCase();
                                            }
                                            if((Integer.parseInt(String.valueOf(finale).substring(8,10))) == 12 ||
                                                    (Integer.parseInt(String.valueOf(finale).substring(8,10))) == 21){
                                                a5 = fin.get(4) + fin.get(4).toLowerCase();
                                            }
                                            if ((Integer.parseInt(String.valueOf(finale).substring(8,10))) == 22){
                                                a5 = (fin.get(4) + fin.get(4)).toLowerCase();
                                            }
                                            rowData[a] = String.format(a1 + a2 + a3 + a4 + a5);
                                            a ++;

                                        }
                                    }
                                }
                            }
                        }

                        model.addRow(rowData);
                    }
                }
            }
        }
    }

    punnett.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);      
    JScrollPane pane = new JScrollPane(punnett, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    gamFrame.add(pane);

    gamFrame.setSize(1500,500);
    gamFrame.setTitle("Pentahybrid cross");
    gamFrame.setVisible(true);
}

the List fin here is {"A", "B", "C", "D", "E"} 此处的列表鳍为{“ A”,“ B”,“ C”,“ D”,“ E”}

  • Part 1 :( possible problem ) 1部分:( 可能的问题

Your code has to many for.... To much work for the main Thread.. Try to run this method into another Thread so you can press and The other buttons. 您的代码有很多用...。主线程需要做很多工作。尝试将此方法运行到另一个线程中,以便可以按和其他按钮。

The mainReason that your programm lag is that the main Thread is trying to end the method(you call) and until it finish with this it dont respond to anything. 您的程序滞后的主要原因主线程试图结束该方法(您调用) ,直到完成该操作,它才不响应任何内容。

  • Part 2 :( example of a Thread ) 2部分:( 线程示例

    Call the method like this: (Basically you need an extra Thread to share the work in your proggram) 调用这样的方法:(基本上,您需要一个额外的线程来共享程序中的工作)

     new Thread(new Runnable(){ public void run(){ //Here i call The method i want(); }}).start; 

    or you can put the thread to be the body of your method or or or... 或者您可以将线程作为方法的主体,或者或者或者或者...

I am facing this problem to much times with java swing... 我用Java swing多次面对这个问题...

And something more(if you havent work with Threads add a comment and i will add more things about java - Threads ). 还有更多(如果您还没有使用Threads,请添加注释,我将添加有关java-Threads的更多信息)。

Let me know if that worked for you... 让我知道这是否对您有用...

  • Part 3 ( Help working with Threads + one suggested solution ) 3部分( 帮助使用线程+一种建议的解决方案

    More Help on how to work with Threads(from beginner to Super) 有关如何使用线程的更多帮助(从初学者到超级)

    These are some good tutorials to have a complete view: First link 这些是一些很好的教程,可以使您有一个完整的视图: 第一个链接

And of course oracle documentation for better understand.... oracle Threads 当然还有oracle文档,可以更好地理解...。 oracle线程

Also try this With your code: 也可以尝试以下代码:

public void punnett5(final List<String> fin){

   new Thread(new Runnable(){

     public void run(){

       //Your Method here..

        JFrame gamFrame = new JFrame();

       Object row[][] = {};
       Object column[] = {};

        .......

       JScrollPane pane = new JScrollPane(punnett,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,   JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
gamFrame.add(pane);

gamFrame.setSize(1500,500);
gamFrame.setTitle("Pentahybrid cross");
gamFrame.setVisible(true);

    }}).start;

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM