【问题标题】:Crash when entering a while loop进入while循环时崩溃
【发布时间】:2015-05-28 13:36:01
【问题描述】:

昨天我问了一个问题,因为我正在制作一个小的基本应用程序,它将打开一个带有文本字段和两个按钮的 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 字符串变量转换为文本字段中写入的内容并打开第二个 jFrame。如果它已经打开,那么它将只接收文本。然后,在另一个 jFrame 上,我写了这个:

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

如果你写了一个零,这基本上会使 jPanel 变成绿色。问题是它只会在你第一次按下它时起作用。如果您写下另一个数字并再次按下按钮,它将保持相同的颜色。我尝试在 if-else 语句周围使用“while (true)”循环,但每当我运行它并按下按钮时,程序就会冻结。我该如何解决这个问题?我在 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 设计器生成。

【问题讨论】:

  • "我尝试使用 "while (true)" 循环" >> 在你的 while(true) 循环中添加以下内容:try{Thread.sleep(100);}catch(InterruptedException e){ };基本上在每个循环中暂停 100 毫秒。
  • 冻结问题可能来自于您的 while 占用了所有线程操作。您是否尝试过调试以查看是否再次输入了操作代码(单击按钮后)?我们可能需要更多关于如何处理按钮事件的代码
  • @AlanHay 我刚刚尝试添加该 try-catch 并没有任何区别。当我按下按钮时仍然崩溃。
  • 就像你以前的 advised yesterday 一样,发布一个 MCVE。不是不可编译的代码 sn-ps,肯定不是指向“我的代码压缩包”的链接。哦,你为什么还在使用多帧?
  • 什么崩溃?没有按预期行事并不是崩溃。不清楚你在问什么。

标签: java swing while-loop jframe jpanel


【解决方案1】:

你的代码有几个问题,我认为你应该修复它们。

  1. 根据不反映颜色变化,您的颜色变化代码在另一个 JFrame 类中,并且您没有在点击事件中调用它。您应该修复按钮的回调,您可以尝试在按钮回调函数中调用jPanel1.setBackground(
  2. 另外,你不应该在每次点击按钮时都初始化p = new Panel(),所以你应该把它移到if循环中(或者最好在构造函数中进行,并且在“if循环”中只设置可见性。
  3. 您正在运行,而 busy主线程 上循环,所以它冻结了 UI
  4. 您应该使用类实例而不是静态变量来维护应用程序的状态。

【讨论】:

  • 我尝试将 jPanel1.setbackground 移动到按钮,但它没有改变任何东西,它仍然只能工作一次。另外,我该如何解决其他两个问题?正如我所说,我对 Java 还很陌生,我不明白“在忙循环中运行”的事情和应用程序的状态。
  • 我添加了唯一剩下的代码部分。正如我所说,我使用 Netbeans 设计器制作 jFrame,因此其余代码由程序自动制作。我的帖子上的内容是我到目前为止所写的所有内容。
  • 1) 能否包含按钮回调的完整方法,包括方法签名。 2) 包含jPanel1类的代码
【解决方案2】:

您想要实现的是处理每一个按键。这是在 ActionEventListener 中完成的。 详情见这个问题:JFrame ActionListener

【讨论】:

    【解决方案3】:

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

    IF 框架已经可见 检查 Value = 0 是否将 OPEN 设置为绿色(新框架中的面板) 如果不设置为黑色。

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

    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();
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-27
      • 2016-06-19
      • 2012-06-19
      • 2021-07-09
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多