我编写了一个程序,接受数字并根据输入的数字生成表格。该程序最多可以处理4个数字但是当我尝试使用5的相同程序时,程序会挂起。 JFrame的截图。
http://i.imgur.com/pXuYCol.png(我没有足够的声誉来发布图片。)
按钮保持按下但程序的下一部分未执行,我无法点击任何其他按钮,也无法关闭窗口。
知道为什么会这样,以及如何避免这种情况?
编辑:这是按下按钮时应该执行的方法。
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);
}
这里的List fin是{“A”,“B”,“C”,“D”,“E”}
答案 0 :(得分:1)
你的代码需要很多......为主线程做了很多工作.. 尝试将此方法运行到另一个Thread中,以便按下和其他按钮。
您的程序滞后的主要原因是主线程正在尝试结束方法(您调用),直到它完成此操作它不响应任何事情。
2 部分:( 线程示例)
调用这样的方法:(基本上你需要一个额外的线程来分享你的程序中的工作)
new Thread(new Runnable(){
public void run(){
//Here i call The method i want();
}}).start;
或者你可以把线程作为你方法的主体 或者或者......
我使用 java swing ...
多次遇到这个问题还有更多(如果您没有使用Threads添加注释,我将添加更多关于 java - Threads 的内容)。
如果这对您有用,请告诉我......
部分 3 ( 使用线程帮助+一个建议的解决方案 )
有关如何使用线程的更多帮助(从初学者到超级)
这些是一些很好的教程,可以获得完整的视图: First link
当然还有oracle文档,以便更好地理解.... oracle Threads
还可以使用您的代码尝试:
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;
}