进入while循环时崩溃

时间:2015-05-28 13:36:02

标签: java swing while-loop jframe jpanel

昨天我问了一个问题,因为我正在制作一个小型的基本应用程序,可以打开带有文本字段和两个按钮的jFrame。如果你写了一些内容然后点击了按钮,那么另一个jFrame会出现在里面的jPanel,如果你写了零,它会变成绿色,或者在任何其他结果时变成黑色。我不知道如何让它发挥作用。我终于让它正常工作,但它只是第一次这样做。问题是,当按下按钮时会发生这种情况:

    Taller2.opcion = jTextField2.getText();
    Panel p;
    p = new Panel();
    if (Taller2.panelabierto == false) {
        p.setVisible(true);
        Taller2.panelabierto = true;
    }
    else {
            // No hacer nada
    }

它将Taller2.opcion String变量转换为文本字段中的内容并打开第二个jFrame。如果它已经打开,那么它只需要文本。然后,在另一个jFrame上,我写了这个:

    if ("0".equals(Taller2.opcion)) {
        jPanel1.setBackground(java.awt.Color.GREEN);
    }
    else {
        jPanel1.setBackground(java.awt.Color.BLACK);
    }

如果你写了零,这将基本上将jPanel变为绿色。问题是它只会在你第一次按下时才能工作。如果您再写一个号码并再次按下该按钮,它将保持相同的颜色。我尝试使用" while(true)"围绕if-else语句循环,但每当我运行它并按下按钮时,程序就会冻结。我怎么能解决这个问题?我在Java方面相当新,所以我很欣赏相当简单的答案。我和Netbeans设计师一起制作了两个jFrame,所以我不知道它们背后的代码,只是我添加的代码来改变颜色和按钮。谢谢!

编辑:这是我还没有添加的代码的唯一部分,这是主要的类:

public class Taller2 {

    /**
     * @param args the command line arguments
     */
    public static String opcion;
    public static boolean panelabierto;
    public static void main(String[] args) {
        Pregunta a = new Pregunta();
        a.setVisible(true);
        opcion = null;
        panelabierto = false;

其余部分由Netbeans设计师制作。

3 个答案:

答案 0 :(得分:2)

您的代码存在一些问题,我认为您应该修复它们。

  1. 根据 未反映颜色变化 ,您的颜色更改代码存在于另一个JFrame类中,并且您没有在click事件上调用它。你应该修复按钮的回调,你可以尝试在按钮回调函数中调用jPanel1.setBackground(
  2. 此外,您不应该每次单击按钮时初始化p = new Panel(),因此您应该将其移动到内部if循环(或者更好地在构造函数中执行它,并且在“if循环”中仅设置可见性
  3. 您正在忙碌循环主线程,因此冻结用户界面
  4. 您应该使用类实例而不是静态变量来维护应用程序的状态。

答案 1 :(得分:0)

您想要实现的是处理每一个按键。这是在ActionEventListener中完成的。 有关详细信息,请参阅此问题:JFrame ActionListener

答案 2 :(得分:0)

嘿,我认为这应该有效。在我的测试结果,它工作得很好。我以不同的方式创建了我的面板,但您唯一需要担心的是逻辑。基本上我通过调用构建面板的方法创建第一帧,其中包含按钮和文本字段。然后我们为按下按钮创建ActionListener。现在这是逻辑。

IF帧已经可见 如果将OPEN设置为绿色(新框架中的面板),请检查Value = 0 如果没有设置为黑色。

如果框架未打开,请创建一个!

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class JavaApplication2 extends JFrame {
private JButton btnSubmit;
private JTextField jtf;
private JPanel mainPanel, current, open;
private JFrame  frame;
private String value;
public JavaApplication2()
{
    super("Panel colors");
    mainPanel = new JPanel();
    mainPanel.add(configureFirst());
    setSize(250,240);
    add(mainPanel);
    setVisible(true);
    setLocationRelativeTo(null);
    frame = new JFrame();
    open = new JPanel();
    btnSubmit.addActionListener((ActionEvent e) -> {
       value = jtf.getText();
       if(frame.isVisible())
       {
           if(value.equals("0"))
           {

                open.setBackground(Color.GREEN);
           }
           else
           {
                open.setBackground(Color.BLACK);
           }
       }
       else
       {
           frame.setSize(200,200);
           frame.setVisible(true);
           frame.add(open);
           if(value.equals("0"))
           {

                open.setBackground(Color.GREEN);
           }
           else
           {
                open.setBackground(Color.BLACK);
           }
       }

    });
}


private JPanel configureFirst()
{
    current = new JPanel(new GridLayout(2,1));
    jtf = new JTextField(12);
    btnSubmit = new JButton("Submit");
    current.add(jtf);
    current.add(btnSubmit);
    return current;
}

public static void main(String[] args)
{
    JavaApplication2 jp = new JavaApplication2();
}
}