JFrame有时根本不出现?

时间:2014-06-07 05:33:14

标签: java swing jframe

我目前有一个由NetBeans创建的JFrame。大多数情况下,当我运行程序时它完全正常 - GUI出现,组件正确,我设置的值是正确的等等。

然而,每隔一段时间,GUI就会失败。只是......没有出现。没有框架出现。更糟糕的是,Java仍然为JFrameInstance.isVisible()返回true并强制我手动终止该程序。换句话说,该计划不会停止。我还没有找到答案。

我的代码,没有多余的设置代码:

public class Setup extends javax.swing.JFrame {

  /** Creates new form Setup */
  public Setup() {
    initComponents();
    customComponents();
    setVisible(true);
  }

  private void customComponents() {
    setTitle("Setup");
    setPatchNotesText(Browser.getVersionNotes());
    jSlider1.setValue(SettingsHandler.getDelayTime());
    jCheckBox1.setSelected(SettingsHandler.getCheckPaxWebsite());
    //More of the same type of code...
  }

  public void setPatchNotesText(final String text) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        jTextArea4.setText(text);
        jTextArea4.setCaretPosition(0);
      }
    });
  }

  private void initComponents() {

    jTabbedPane1 = new javax.swing.JTabbedPane();
    jPanel1 = new javax.swing.JPanel();
    jLabel1 = new javax.swing.JLabel();
    //Lots more component construction...

    jLabel5.setText("Setup Options");
    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(jPanel1Layout.createSequentialGroup()
        .addContainerGap()
        //....Begin the huge NetBeans GUI setup code. Removed for readability.
  }
}

main()方法中的代码......

  public static void main(String[] args) throws Exception {
    System.out.println("Initializing...");
    Browser.init();
    Email.init();
    setup = new Setup();
    while (setup.isVisible()) { // Returns true...
      Thread.sleep(100);
    }
    //More code...
  }

1 个答案:

答案 0 :(得分:1)

您的症状描述了一个典型的线程问题 - 即使代码未更改,也会间歇性地出现问题。看起来你的真实可能是罪魁祸首。我建议你改为考虑:

  • 确保在EDT上启动Swing GUI。
  • 使用Swing Timer代替while(....)循环,并确保在事件线程上调用此函数。
  • 一个不相关的建议 - 您需要提供具有逻辑意义的变量名称,这会使您的代码自我评论。像jLabel1,jPanel1,jTabbedPane1这样的变量名称对于审核你的代码的人来说没有什么意义(比如我们!),甚至可能会在你想要修改或改进这个程序的几个月后混淆你未来的自我。

修改 你发表评论:

  

我希望我的main()线程暂停直到GUI关闭 - 除了使用volatile布尔值之外,还有什么方法可以在线程之间进行吗?

是的,有一些很多更好的解决方法:

  • 将WindowListener附加到要侦听关闭的窗口
  • 或者在模态JDialog而不是JFrame中显示GUI。