закрытие JFrame кнопкой без прерывания программы - PullRequest
0 голосов
/ 25 апреля 2011

Есть два кадра, и когда вы нажимаете кнопку на первом кадре, он открывает второй кадр. На втором кадре я пытаюсь создать кнопку, которая при нажатии закрывает JFrame, не завершая программу, но мне не повезло. Это код, который я пытаюсь использовать для второго кадра, который без кнопки прекрасно компилируется:

class Time_First_Depot extends JFrame
{   
    Time_First_Depot()
    {
        Container c = getContentPane(); \\ creates content pane
        c.setLayout ( null );

        Color b = new Color(100,200,255); \\ set colour of JFrame 
        c.setBackground( b );

        JButton exit = new JButton("EXIT"); \\creats button
        exit.addActionListener(new ExitButtonListener()); \\ adds listener to button

        exit.setForeground(Color.BLUE); \\edits buton
        exit.setFont(new Font("Time", Font.BOLD, 12));

        c.add(exit);\\adds button

        exit.setBounds(250, 375, 90, 30);\\ sets location of button

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        this.setBounds((int) screenSize.getWidth()/2 - 370, (int) screenSize.getHeight()/2 - 300, 600, 450);  // set position and size
        this.setResizable(false);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        this.setTitle("Time");
        this.setVisible(true);
        this.setResizable(false);
    }
}

class ExitButtonListener implements ActionListener
{
    ExitButtonListener(){}
            public void actionPerformed(ActionEvent e)
            {
                    if (e.getActionCommand().equals("EXIT"))
                    {

                            dispose();
                    }
            }

}

При компиляции я получаю следующее сообщение об ошибке:

cannot find symbol
symbol  : method dispose()
location: class ExitButtonListener
                            dispose();
                            ^

(Примечание: я удалил биты или нерелевантный код, который не имеет ничего общего с вопросом.)

Заранее спасибо за помощь, кто-нибудь может дать мне.

Ответы [ 4 ]

1 голос
/ 25 апреля 2011

Метод dispose - это метод вашего JFrame.Поэтому предлагаю передать ссылку на ваш ActionListener.

class ExitButtonListener implements ActionListener {
    private final JFrame frame;

    ExitButtonListener(JFrame frame) {
        this.frame = frame;
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("EXIT")) {
            frame.dispose();
        }
    }
}
1 голос
/ 25 апреля 2011

Если вы хотите удалить фрейм Time_First_Depot, то вы должны вызвать dispose () для фактического активного экземпляра этого класса;поэтому обработчику событий необходим доступ к этому экземпляру.Есть разные способы сделать это.Один из способов: передать this в конструктор ExitButtonListener;пусть конструктор примет аргумент JFrame и сохранит его в переменной-члене, затем вызовет dispose () через этот член.

0 голосов
/ 27 августа 2014

Вы должны рассмотреть возможность запуска DefaultCloseOperation, который не будет выполнять ничего, кроме запуска того же процесса, как если бы вы нажали на красный крестик в правом верхнем углу вашего JFrame.

Тогда удаление будет выполнено.самим JFrame или, скорее, уже указанным:

this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

Вы можете сделать это, как описано в ответах на этот вопрос несколькими способами.

Возможность первая: вы ставите в очередь WindowEvent, тем самым подделывая операцию CloseOperation:

public void actionPerformed (Event e) {
    WindowEvent wev = new WindowEvent(
         SwingUtilities.windowForComponent((Component) e.getSource()),
         WindowEvent.WINDOW_CLOSING
    );
    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
}

Возможность вторая: вы избавляетесь от окна, не ставя в очередь событие, но тем самым пропускаете все указанные вами EventListener:

public void actionPerformed (Event e) {
     JFrame rootWindow = ((JFrame) SwingUtilities.getRoot((Component) e.getSource()));
     rootWindow.dispose();
}
0 голосов
/ 25 апреля 2011

Есть два кадра, и когда вы нажимаете кнопку на первом кадре, он открывает второй кадр. На втором кадре я пытаюсь создать кнопку, которая при нажатии закрывает JFrame без завершения ..

Если вы можете поменять 2-е JFrame на JOptionPane (или модальное JDialog), большинство проблем будет решено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...