从同一个包中的按钮打开JFrame时出现内存不足错误?

时间:2014-07-12 07:05:46

标签: java swing jframe out-of-memory jbutton

我的程序运行正常,直到我在第二类的JFrame中使用switch语句从同一个包中的第一个类打开。我的内存错误..与堆空间有关。我删除了那个switch语句仍然发生了同样的错误。当jframe之间没有链接时,它们运行得很好。但当我链接它们,第一帧工作,点击提交按钮,它消失了,可能是因为在它的动作我已经使用了这个。但它没有打开第二帧,并在5-10分钟后我出现内存错误

1类(JFrame1)

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            qualification = (String)degree.getSelectedItem( );
    contact_num= Integer.parseInt(num.getText());
    String xyz= (String)d.getSelectedItem();
    date=Integer.parseInt(xyz);
    xyz= (String)m.getSelectedItem();
    month=Integer.parseInt(xyz);
    year=Integer.parseInt(y.getText());
    street= (String)(strt.getText());
    name=(String)nme.getText();
    email= (String)e_mail.getText();
    state= (String)stt.getText();
    city= (String)cty.getText();
    gender= (String)sex.getSelectedItem();
    Sample a=new Sample();
    a.setVisible(true);
       this.dispose();
}

等级2(JFrame2)

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    System.out.print("ab");

}                                        

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    System.out.print("b");

}                                        

带有switch语句的Class2的代码,因为我得到了该错误

public Qualification abc=new Qualification();
    Sample aa= new Sample();
    public String s;
    public void open_sample()
    {
        this.setVisible(true);
        switch(abc.qualification)
        {
            case "BE":
            BE1 a=new BE1(); 
            break;
            case "10th/12th":
            C101 b=new C101();
            b.setVisible(true);
            break;
            case "MBA":
            MBA1 c=new MBA1();
            c.setVisible(true);
            break;
            case "CA":
            CA1 x=new CA1();
            x.setVisible(true);
            break;
            default:

        }
    }

private void sa1ActionPerformed(java.awt.event.ActionEvent evt) {                                   s= evt.getActionCommand();
         open_sample();
 }                                   

    private void sa4ActionPerformed(java.awt.event.ActionEvent evt) {                                    
        s= evt.getActionCommand();
   open_sample();}                                   

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
                      System.out.print("hello");
  }                                        

    private void sa3ActionPerformed(java.awt.event.ActionEvent evt) {                                    
        s= evt.getActionCommand();
       open_sample();
    }                                   

    private void sa2ActionPerformed(java.awt.event.ActionEvent evt) {                                    
           s = evt.getActionCommand();
      open_sample();
    } 

2 个答案:

答案 0 :(得分:0)

当您尝试将更多数据添加到内存中的堆空间区域时会触发“java.lang.OutOfMemoryError:Java堆空间”错误,但此数据的大小大于JVM在Java堆中可容纳的大小空间。

在许多情况下,您可以通过在启动脚本中指定(或增加,如果存在)-Xmx参数来增加堆空间,例如-Xmx1024m。

答案 1 :(得分:0)

我的第一个想法是:

final Sample a = new Sample();
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        a.setVisible(true);
    }
});
this.dispose();

这通常是一种很好的做法,可以快速处理事件队列处理线程上的事件,并稍后执行实际工作。

然而,一个错误似乎是代码使用 fields 而不是局部变量,并且似乎在Sample构造函数中使用。那么Sample是一个嵌入式类?然后this.dispose()不会释放类本身,只要未释放Sample,它就会保留JFrame1.this

不确定这是否有帮助,但是一些代码重写似乎是合适的。

也可以尝试

setDefaultCloseOperation(DISPOSE_ON_CLOSE); // Init
...
setVisible(false); // Instead of dispose()