Выполнение действия при закрытии JFrame - PullRequest
0 голосов
/ 23 апреля 2011

В моей программе у меня есть основной JFrame, который содержит кнопку. При нажатии этой кнопки появляется новый JFrame, в котором я могу изменить некоторую информацию. Всякий раз, когда я заканчиваю редактирование, я нажимаю кнопку сохранения на новом JFrame, который сохраняет изменения и удаляет JFrame. Теперь, когда это будет сделано, я бы хотел выполнить действие и в основном JFrame, но только если что-то изменилось. Если я открою новый JFrame и просто закрою его снова, не используя кнопку сохранения, я не хочу ничего делать в основном кадре. Я пытался найти решение в Интернете, но, похоже, ничего полезного там нет ...

Пример кода, который я получил до сих пор: Основная рама ...


public class MainFrame extends JFrame
 {
     public MainFrame()
     {
         super("Main Frame");
         JButton details = new JButton("Add Detail");
         add(details);
         details.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e)
             {
                 new DetailFrame().setVisible(true);
             }
         });
     }
 }

Деталь Рамка ...


 public class DetailFrame extends JFrame
 {
     public DetailFrame()
     {
         super("Detail Frame");
         JButton save = new JButton("Save");
         add(save);
         save.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e)
             {
                 // Save whatever content
                 dispose();
             }
         });
     }
 }

Таким образом, когда я нажимаю кнопку «Сохранить» в подробном фрейме, я хочу сделать что-то в главном фрейме, в то время как при нажатии «x» в подробном фрейме я не хочу ничего делать

Надеюсь, кто-то может мне помочь, и извините за мой английский ..

Ответы [ 3 ]

2 голосов
/ 23 апреля 2011

Вы можете передать дескриптор MainFrame конструктору DetailFrame.Затем, нажав кнопку «Сохранить», DetailFrame вызовет функцию в MainFrame и передаст изменения.

Другой способ - создать переменную public boolean в DetailFrame и установить ее на true, когдаКнопка Сохранить нажата.Таким образом, MainFrame будет знать, был ли DetailFrame закрыт или сохранен.

РЕДАКТИРОВАТЬ: Еще несколько идей:

Используйте JDialog вместо JFrame.JDialog.setVisible является модальным, то есть блокирует вызывающую функцию до закрытия диалога;таким образом вы можете обработать результаты диалога в том же прослушивателе кнопки «Подробнее».

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

Сохраните результаты редактирования в других открытых переменных DetailFrame (или назовем его DetailDialog).Это должно происходить только при нажатии кнопки «Сохранить».Это может даже позволить обойтись без логической переменной (зависит от типов значений, которые вы редактируете).

DetailDialog dlg = new DetailDialog();
dlg.setVisible(true);
if(dlg.approvedResult != null) {
    // process the result...
}

РЕДАКТИРОВАТЬ: Извините, JDialog не является модальным по умолчанию.Вам нужно вызвать специальный конструктор super, чтобы сделать его модальным.

Кроме того, здесь вам придется передать ссылку на MainFrame в конструктор диалога, но вы все равно можете объявить его простым JFrame и избегайте ненужных зависимостей.

Чтобы получить ссылку на включающий MainFrame из анонимного ActionListener, используйте MainFrame.this.

Чтобы иметь возможность изменить текст кнопки после того, как она былаПосле создания вам нужно будет сохранить кнопку в переменной-члене.

Основной кадр ...

public class MainFrame extends JFrame
{
    private JButton details = new JButton("Add Detail");

    public MainFrame()
    {
        super("Main Frame");
        getContentPane().add(details);
        details.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                DetailDialog dlg = new DetailDialog(MainFrame.this);
                dlg.setVisible(true);
                if(dlg.approved){
                    details.setText("Edit Detail");
                }
            }
        });
    }
}

Подробный диалог ... (не кадр)

public class DetailDialog extends JDialog
{
    public boolean approved = false;

    public DetailDialog(JFrame parent)
    {
        super(parent,"Detail Dialog",true);        // modal dialog parented to the calling frame
        JButton save = new JButton("Save");
        getContentPane().add(save);
        save.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                // Save whatever content
                approved = true;
                dispose();
            }
        });
    }
}
0 голосов
/ 23 апреля 2011

Забудь 2-е JFrame. вместо этого используйте модальный диалог. Он будет блокировать ввод, пока не будет отклонен. После увольнения остается только решить, обновить ли исходные данные. JOptionPane имеет некоторые встроенные функции, которые делают это легко. Если пользователь нажимает клавишу Cancel или esc, метод showInputDialog() вернет null в качестве результата.

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

class EditInfo {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                final JFrame f = new JFrame("Uneditable");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JPanel p = new JPanel(new BorderLayout(10,10));

                final JTextField tf = new JTextField("Hello World!", 20);
                tf.setEnabled(false);
                p.add(tf, BorderLayout.CENTER);

                JButton edit = new JButton("Edit");
                edit.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        String result = JOptionPane.showInputDialog(
                            f,
                            "Edit text",
                            tf.getText());
                        if (result!=null) {
                            tf.setText(result);
                        }
                    }
                } );
                p.add(edit, BorderLayout.EAST);

                p.setBorder(new EmptyBorder(10,10,10,10));

                f.setContentPane(p);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

Если необходимо отредактировать сразу несколько полей в JOptionPane, используйте JPanel, чтобы вместить их все, и поместите их в вызов showMessageDialog(). Проверьте результат возврата на основе целых чисел, чтобы определить, согласен ли пользователь с изменениями.

0 голосов
/ 23 апреля 2011

Создайте подробный фрейм в главном фрейме и добавьте в него оконный список, используя класс windowadapter. Реализуйте событие оконного закрытия, проверив изменения, обработайте их, а затем разместите подробный фрейм. Все это делается в мэйнфрейме.

Фрейм детализации не должен делать ничего при закрытом наборе, чтобы предотвратить размещение фрейма детали до того, как вы записали изменения.

Возможно, вы захотите реализовать проверку изменений в деталях как метод, возвращающий класс, содержащий интересные данные. Таким образом, ваш оконный стеклоподъемник может быть небольшим по размеру.

...