在我的程序中单击一个按钮时,我使用的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();
}
}
答案 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();
}
}
}