Si el diálogo desaparecerá después de que el usuario pulsa confirmar:
- y desea tener la comportan de diálogo como un referente JDialog, entonces es fácil, ya que usted sabe en qué el código de su programa será tan pronto como el usuario termine de tratar con el cuadro de diálogo; será justo después de llamar al
setVisible(true)
en el cuadro de diálogo. Por lo tanto, simplemente consulte el objeto de diálogo por su estado en las líneas de código inmediatamente después de llamar al setVisible(true)
en el cuadro de diálogo.
- Si necesita tratar con un cuadro de diálogo no modal, necesitará agregar un WindowListener al cuadro de diálogo para recibir una notificación cuando la ventana del cuadro de diálogo se haya vuelto invisible.
Si el diálogo es permanecer abierto después de que el usuario pulsa confirman:
- entonces usted probablemente debería utilizar un PropertyChangeListener como se ha sugerido anteriormente. O bien, o bien, otorgue al objeto de diálogo un método público que permita a las clases externas la posibilidad de agregar un ActionListener al botón de confirmación.
Para obtener más información, por favor muéstranos partes relevantes de tu código, o mejor aún, un sscce.
Por ejemplo, para permitir la clase JDialog para aceptar los oyentes fuera, podría darle un JTextField y JButton:
class MyDialog extends JDialog {
private JTextField textfield = new JTextField(10);
private JButton confirmBtn = new JButton("Confirm");
y un método que permite a clases fuera para añadir un ActionListener al botón:
public void addConfirmListener(ActionListener listener) {
confirmBtn.addActionListener(listener);
}
Luego, una clase externa simplemente puede llamar al método `addConfirmListener (...) para agregar su ActionListener al confirmBtn.
Por ejemplo:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class OutsideListener extends JFrame {
private JTextField textField = new JTextField(10);
private JButton showDialogBtn = new JButton("Show Dialog");
private MyDialog myDialog = new MyDialog(this, "My Dialog");
public OutsideListener(String title) {
super(title);
textField.setEditable(false);
showDialogBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (!myDialog.isVisible()) {
myDialog.setVisible(true);
}
}
});
// !! add a listener to the dialog's button
myDialog.addConfirmListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text = myDialog.getTextFieldText();
textField.setText(text);
}
});
JPanel panel = new JPanel();
panel.add(textField);
panel.add(showDialogBtn);
add(panel);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
private static void createAndShowGui() {
JFrame frame = new OutsideListener("OutsideListener");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MyDialog extends JDialog {
private JTextField textfield = new JTextField(10);
private JButton confirmBtn = new JButton("Confirm");
public MyDialog(JFrame frame, String title) {
super(frame, title, false);
JPanel panel = new JPanel();
panel.add(textfield);
panel.add(confirmBtn);
add(panel);
pack();
setLocationRelativeTo(frame);
}
public String getTextFieldText() {
return textfield.getText();
}
public void addConfirmListener(ActionListener listener) {
confirmBtn.addActionListener(listener);
}
}
Advertencias sin embargo: No recomiendo como subclase de JFrame o JDialog menos que sea absolutamente necesario. Fue hecho aquí simplemente por el bien de la brevedad. Yo también prefiero usar un diálogo modal para resolver este problema y volver a abrir el diálogo cuando sea necesario.
Editar 2
Un ejemplo de uso de un de diálogo modal :
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class OutsideListener2 extends JFrame {
private JTextField textField = new JTextField(10);
private JButton showDialogBtn = new JButton("Show Dialog");
private MyDialog2 myDialog = new MyDialog2(this, "My Dialog");
public OutsideListener2(String title) {
super(title);
textField.setEditable(false);
showDialogBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (!myDialog.isVisible()) {
myDialog.setVisible(true);
textField.setText(myDialog.getTextFieldText());
}
}
});
JPanel panel = new JPanel();
panel.add(textField);
panel.add(showDialogBtn);
add(panel);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
private static void createAndShowGui() {
JFrame frame = new OutsideListener2("OutsideListener");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MyDialog2 extends JDialog {
private JTextField textfield = new JTextField(10);
private JButton confirmBtn = new JButton("Confirm");
public MyDialog2(JFrame frame, String title) {
super(frame, title, true); // !!!!! made into a modal dialog
JPanel panel = new JPanel();
panel.add(new JLabel("Please enter a number between 1 and 100:"));
panel.add(textfield);
panel.add(confirmBtn);
add(panel);
pack();
setLocationRelativeTo(frame);
ActionListener confirmListener = new ConfirmListener();
confirmBtn.addActionListener(confirmListener); // add listener
textfield.addActionListener(confirmListener);
}
public String getTextFieldText() {
return textfield.getText();
}
private class ConfirmListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String text = textfield.getText();
if (isTextValid(text)) {
MyDialog2.this.setVisible(false);
} else {
// show warning
String warning = "Data entered, \"" + text +
"\", is invalid. Please enter a number between 1 and 100";
JOptionPane.showMessageDialog(confirmBtn,
warning,
"Invalid Input", JOptionPane.ERROR_MESSAGE);
textfield.setText("");
textfield.requestFocusInWindow();
}
}
}
// true if data is a number between 1 and 100
public boolean isTextValid(String text) {
try {
int number = Integer.parseInt(text);
if (number > 0 && number <= 100) {
return true;
}
} catch (NumberFormatException e) {
// one of the few times it's OK to ignore an exception
}
return false;
}
}
Implementé listener dentro de JDialog y puedo escuchar el botón dentro de ese diálogo, pero necesito escuchar ese botón fuera del diálogo - en la aplicación principal, donde llamé al diálogo –
¿Se puede editar la clase 'JDialog'? Si es así, puedes reenviar el 'ActionEvent' a otra clase que implemente la interfaz' ActionListener' y esa clase puede hacer lo que quieras. – mre
Hice AddISDialog mismo (la clase pública AddISDialog extiende que JDialog implementa ActionListener) así que sí, puedo editarlo. ¿Qué quieres decir con reenviar ActionEvent a otra clase? ¿Cómo puedo hacerlo? –