我试图在JPanel上创建一个JButton,当点击它时,会产生一个冰雹数字(如果数字是偶数除以2;如果数字是奇数,则乘以3然后加一个)。但是,当我单击我的JButton时,程序冻结并且没有输出数字。为什么会这样?
这是我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Panel03 extends JPanel {
private JLabel label;
private JButton button;
private JTextField box;
public Panel03()
{
box = new JTextField("0", 10);
box.setForeground(Color.black);
box.setHorizontalAlignment(SwingConstants.RIGHT);
add(box);
label = new JLabel();
label.setFont(new Font("Serif", Font.BOLD, 20));
label.setForeground(Color.blue);
add(label);
button = new JButton("Next");
button.addActionListener(new Listener());
add(button);
}
private class Listener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String s = box.getText();
int a = Integer.parseInt(s);
int b = a;
do {
if(a%2 == 0){b/=2.0;}
else{a=((3*b)+1);}
label.setText(Integer.toString(b));
}
while(b!= 4||b!= 2||b!= 1);
}
}
}
答案 0 :(得分:0)
每当程序冻结时,无限循环是主要的嫌疑人。在这种情况下,将此行添加到循环
System.out.printf("* a=%d b=%d\n",a,b);
永远显示a = 0和b = 0。由于a为零,因此%2 = 0,而b / = 2仍然为零,因此变量永远不会改变。从a = 1开始仍然卡在a = 4,b = 0。事实上,对于我输入的任何数字,b变为零并且循环卡住。我不确定你在这里尝试做什么,但我怀疑你的循环退出逻辑应该是而不是或者,并且需要捕获b = 0的可能性:
while (b!=4 && b!=2 && b!=1 && b!=0);