Java 单击按钮关闭窗口

Java 单击按钮关闭窗口,java,swing,awt,Java,Swing,Awt,你好, 我使用的是JavaSwing,我想点击按钮关闭一个窗口。我不知道使用actionlistener是最好的方法,但目前我有编译错误,所以它一定是不正确的 这是我的代码: public class assignment2 { public static void main(String[] args){ MyFrame f = new MyFrame(); //open the inital gui interface

你好,

我使用的是JavaSwing,我想点击按钮关闭一个窗口。我不知道使用actionlistener是最好的方法,但目前我有编译错误,所以它一定是不正确的

这是我的代码:

    public class assignment2
    {

        public static void main(String[] args){
            MyFrame f = new MyFrame(); //open the inital gui interface
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true); //set it visibile
        }
    }

    //this is the initial gui screen, presenting user with options for which action they would like to take
    //al actions for the gui are commenced here
    class MyFrame extends JFrame{

        public MyFrame(){

            buttonPanel1 p = new buttonPanel1(); // add the buttons for this frame
            add(p);

            setSize(800,600);
            setTitle("Travel Console");
            setLocationRelativeTo(null);
        }
    }

    class buttonPanel1 extends JPanel{
        public buttonPanel1(){
            //create buttons
            JButton addItem = new JButton("Add an Item");
            JButton deleteItem = new JButton("Delete an item");
            JButton listItem = new JButton("List items");
            JButton editItem = new JButton("Edit an item");
            JButton bookFlight = new JButton("Book a flight");
            JButton save = new JButton("Save data");
            JButton load = new JButton("Load data");
            JButton exit = new JButton("Exit");

            //set layout manager for button panel
            setLayout(new GridLayout(8,1,1,5));

            //create buttons
            add(addItem);
            add(deleteItem);
            add(listItem);
            add(editItem);
            add(bookFlight);
            add(load);
            add(save);
            add(exit);

            addItemListener addList = new addItemListener();
            addItem.addActionListener(addList);
            exitListener exitList = new exitListener();
            exit.addActionListener(exitList);
        }

    }

    //listener classes for the inital gui page. each button has its own actionlistener which launches the selected option
    class addItemListener implements ActionListener{
        public void actionPerformed(ActionEvent event){ //launch add item
            addItemFrame addItem = new addItemFrame();
            addItem.setDefaultCloseOperation(addItemFrame.DISPOSE_ON_CLOSE);
            addItem.setVisible(true);
        }

    }
class addItemFrame extends JFrame{
    public addItemFrame(){
        addItemButtonPanel b = new addItemButtonPanel(); // add the buttons for this frame
        add(b);

        setSize(800,500);
        setTitle("Add an Item");
        setLocationRelativeTo(null);
    }
}
//part of addItemFrame class
class addItemButtonPanel extends JPanel{
    public addItemButtonPanel(){
        JLabel selectItem = new JLabel("Select which item you would like to add:");
        JButton newCustomer = new JButton("Customer");
        JButton newflight = new JButton("Flight");
        JButton newMovie = new JButton("Movie");
        JButton goBack = new JButton("Return to main menu");

        setLayout(new GridLayout(5,1,1,5));

        add(selectItem);
        add(newCustomer);
        add(newflight);
        add(newMovie);
        add(goBack);

        goBackListener gbList = new goBackListener();
        goBack.addActionListener(gbList);
    }
}

//listener classes for the addItemFrame
class goBackListener implements ActionListener{
    public void actionPerformed(ActionEvent event){
        addItemFrame.dispose();
    }

}
我遇到的问题是列出的最后一个类
goBackListener
,它实际上只是关闭当前窗口,以便再次显示主菜单屏幕。我需要对在
addItemListener
类中创建的
addItemFrame
的静态引用。但是将其更改为static是无效的修饰符

我如何修复它?

试试这个

//listener classes for the addItemFrame 
class goBackListener implements ActionListener{
    private addItemFrame frame;
    public goBackListener(addItemFrame frame){
        this.frame= frame;
    }
    public void actionPerformed(ActionEvent event){
        frame.dispose();
    }
}
并向其构造函数发送一个addItemFrame的实例

//listener classes for the addItemFrame 
class goBackListener implements ActionListener{
    private addItemFrame frame;
    public goBackListener(addItemFrame frame){
        this.frame= frame;
    }
    public void actionPerformed(ActionEvent event){
        frame.dispose();
    }
}

并将
addItemFrame
的一个实例发送给它的构造函数

“编译错误”复制/粘贴它们作为对问题的编辑。“不知道使用actionlistener是否是最好的方法”查看
WindowListener
,或者调用
JFrame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
。顺便说一句,你应该遵守Sun Java命名约定:类名总是以大写字母开头!如果您已经在使用
JFrame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
,只需在
JFrame
上调用
DISPOSE
即可将其关闭并退出JVM(当然,只要所有非守护进程线程都已完成)。“编译错误”复制/粘贴它们作为对问题的编辑。“不知道使用actionlistener是否是最好的方法”查看
WindowListener
,或者调用
JFrame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
。顺便说一句,你应该遵守Sun Java命名约定:类名总是以大写字母开头!如果您已经在使用
JFrame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
,只需在
JFrame上调用
DISPOSE
即可将其关闭并退出JVM(当然,只要所有非守护进程线程都已完成;)