dispose()的问题;

时间:2014-07-09 22:00:38

标签: java swing jframe dispose

在我的程序中单击一个按钮时,我使用的JFrame应该关闭。但是,dispose()方法似乎不起作用。谁能帮助我?

public class SetUp extends JFrame implements ActionListener, Checker {
    JFrame frame= new JFrame("Set Up");

    public mmSetUp() {      
        setSize(500, 300);

        setLayout(new BorderLayout());

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);        

        setVisible(true);
        pack();

    }

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == Submit) {
            windowclose();          
        }
    }

    public void windowclose() {

        frame.dispose();
    }
}

4 个答案:

答案 0 :(得分:2)

检查完代码之后,可能,因为您的课程已扩展为JFrame,并且您正在将所有元素添加到此扩展框架中。

但是你也创建了一个JFrame,这不是一个好习惯,首先请看The use of multiple JFrames, Good / Bad Practice关于使用多个框架。

现在回到你的代码中,让我们看看它,就像我之前说过的那样,你在你的课堂上扩展JFrame就像这样(我会参考这个框架为 frame1

public class SetUp extends JFrame implements ActionListener, Checker {

但你也在这里创建JFrame(我将引用此框第2帧):

JFrame frame= new JFrame("Set Up");

您正在尝试dispose 第2帧,它实际上正在发生这种情况,但是如果您想要处置第1帧(这是一个它包含您的所有元素,即您正在使用的元素,然后在此方法中,您应该更改:

public void windowclose() {
    frame.dispose();
}

这个:

public void windowclose() {

    this.dispose();
}

此外,我不建议您从JFrame课程延伸,最好是像您一样从中创建对象。

但如果您这样做,那么您应该按如下方式更改您的代码:

public mmSetUp() {  

    frame.setSize(500, 300);

    frame.setLayout(new BorderLayout());

    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);        

    frame.setVisible(true);
    frame.pack();
}

public void actionPerformed(ActionEvent e) {

    if (e.getSource() == Submit) {
        windowclose();          
    }
}

public void windowclose() {

    frame.dispose();
}

我并非100%确定这是有效的还是编译的,因为我不在我的电脑上,所以我无法创建一个完整的例子,但在第一视图中你班上发生了什么。在3个多小时左右的时间里,我可以发布一个可编辑的例子。

但请检查

答案 1 :(得分:2)

你有2个JFrame。 一,正在扩展。 二,一个名为 frame

首先,你只犯了一个错误。

将windowclose()更改为:

public void windowclose() {
    dispose(); // Removed frame part
}

你所做的就是,从开始就完全设置扩展的JFrame,然后单独留下 frame ,使其空闲。

当调用windowclose()时,它会释放空闲的框架,这实际上是无用的,因为除了标题之外你甚至都没有修改过。

更改windowclose()之后,代码应该可以正常工作,现在你可以摆脱

JFrame frame= new JFrame("Set Up");

但是如果你想让一切都更整洁,那就像Frakcool说的那样去除扩展JFrame

答案 2 :(得分:1)

我想你想改为呼叫frame.setVisible( false )

编辑:您的程序有几个逻辑错误。请尝试使用此版本:

  public class WindowCloseTest
  {
     public static void main( String[] args )
     {
        new SetUp().mmSetUp();
     }
  }
  class SetUp implements ActionListener {
      JFrame frame= new JFrame("Set Up");

      public void mmSetUp() {      
          frame.setSize(500, 300);

          JButton b = new JButton( "Submit");
          b.addActionListener(this);
          frame.add( b, BorderLayout.SOUTH );

          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          frame.setLocationRelativeTo(null);        
          frame.pack();
          frame.setVisible(true);
      }

      public void actionPerformed(ActionEvent e) {
         System.out.println( e );
          if (e.getActionCommand() == "Submit") {
              windowclose();          
          }
      }

      public void windowclose() {

          frame.dispose();
      }

  }

答案 3 :(得分:0)

我同意@ user2338547,有些代码你没有告诉我们可能会导致问题,我编写了我的版本用于dispose方法,希望它可以让你知道如何使用方法

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;

    public class GuiTest extends JFrame{

        static GuiTest frame=new GuiTest("test");
        private JPanel panel=new JPanel();
        private JButton button=new JButton("close");
        private Button buttonListener=new Button();

        public GuiTest(String title){
            super(title);
            add(panel);
            panel.add(button);
            button.addActionListener(buttonListener);
        }
        public static void main(String[] args){
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            frame.setSize(100,100);
            frame.setVisible(true);
        }
        class Button implements ActionListener{
            public void actionPerformed(ActionEvent e){
            frame.dispose();
            }
        }
    }