Se la finestra scompare dopo l'utente preme confermare:
- e si desidera avere la finestra di dialogo si comportano come un modale JDialog, allora è facile, dal momento che si sa dove a il codice del programma sarà non appena l'utente avrà terminato la finestra di dialogo - sarà subito dopo aver chiamato
setVisible(true)
nella finestra di dialogo. Quindi basta interrogare l'oggetto di dialogo per il suo stato nelle righe di codice immediatamente dopo aver chiamato setVisible(true)
nella finestra di dialogo.
- Se è necessario gestire una finestra di dialogo non modale, è necessario aggiungere un WindowListener alla finestra di dialogo per essere avvisati quando la finestra di dialogo è diventata invisibile.
Se la finestra è quello di rimanere aperto dopo l'utente preme confermano:
- allora probabilmente si dovrebbe utilizzare un PropertyChangeListener come è stato suggerito in precedenza. In alternativa, o dare all'oggetto di dialogo un metodo pubblico che consente alle classi esterne la possibilità di aggiungere un ActionListener al pulsante di conferma.
Per ulteriori dettagli, vi preghiamo di mostrarci i bit rilevanti del vostro codice, o ancora meglio, un sscce.
per esempio per permettere la classe JDialog di accettare ascoltatori esterni, si potrebbe dare un JTextField e un JButton:
class MyDialog extends JDialog {
private JTextField textfield = new JTextField(10);
private JButton confirmBtn = new JButton("Confirm");
e un metodo che consente alle classi di fuori di aggiungere un ActionListener al pulsante:
public void addConfirmListener(ActionListener listener) {
confirmBtn.addActionListener(listener);
}
Quindi una classe esterna può semplicemente chiamare il metodo `addConfirmListener (...) per aggiungere il suo ActionListener al confirmBtn.
Ad esempio:
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);
}
}
Avvertenze però: Non consiglio sottoclasse JFrame o JDialog se non assolutamente necessario. È stato fatto qui semplicemente per brevità. Anch'io preferisco usare una finestra di dialogo modale per risolvere questo problema e semplicemente riaprire la finestra di dialogo quando necessario.
Edit 2
Un esempio di utilizzo di una finestra di dialogo modale :
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;
}
}
Ho implementato il listener all'interno di JDialog e posso ascoltare il pulsante all'interno di quella finestra di dialogo, ma ho bisogno di ascoltare quel pulsante fuori dalla finestra di dialogo - nell'applicazione principale, dove ho chiamato quella finestra –
Puoi modificare la classe 'JDialog'? In tal caso, è possibile inoltrare 'ActionEvent' a un'altra classe che implementa l'interfaccia' ActionListener' e quella classe può fare ciò che si desidera. – mre
Ho creato personalmente AddISDialog (la classe pubblica AddISDialog estende JDialog implementa ActionListener) quindi sì, posso modificarlo. Cosa intendi per inoltrare ActionEvent in un'altra classe? Come posso farlo? –