Вы можете передать дескриптор 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();
}
});
}
}