Soham
Soham

Reputation: 13

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. A screenshot of the JFrame.

https://i.sstatic.net/vfNcI.png (I don't have enough reputation to post images.)

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"}

Upvotes: 0

Views: 162

Answers (1)

crAlexander
crAlexander

Reputation: 386

  • Part 1:(possible problem)

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)

    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...

And something more(if you havent work with Threads add a comment and i will add more things about java - Threads).

Let me know if that worked for you...

  • Part 3(Help working with Threads + one suggested solution)

    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

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;

}

Upvotes: 1

Related Questions