J'ai une application principale où est la table avec des valeurs. Ensuite, je clique sur le bouton "Ajouter", nouvelle personnalisation (je l'ai fait moi-même) JDialog Type Popup se présente. Là, je peux saisir la valeur, faire des ticks et cliquez sur "Confirmer". J'ai donc besoin de lire cette entrée de la boîte de dialogue afin que je puisse ajouter cette valeur au tableau dans l'application principale. Comment puis-je écouter lorsque vous appuyez sur le bouton "Confirmer", je peux donc lire cette valeur après cela?
addISDialog = new AddISDialog(); addISDialog.setVisible(true); addISDialog.setLocationRelativeTo(null); //somekind of listener... //after "Confirm" button in dialog was pressed, get value value = addISDialog.ISName;
3 Réponses :
Si la boîte de dialogue disparaîtra après que l'utilisateur appuie confirmer:
SetVisible (true) code> sur la boîte de dialogue. Donc, vous interrogez simplement l'objet de dialogue pour son état dans les lignes de code immédiatement après avoir appelé SETVisible (true) code> sur la boîte de dialogue. LI>
- Si vous avez besoin de traiter avec une boîte de dialogue non modale, vous devez ajouter une fenêtre de fenêtre à la boîte de dialogue à notifier lorsque la fenêtre de la boîte de dialogue est devenue invisible. LI>
ul>
Si la boîte de dialogue est de rester ouverte après que l'utilisateur appuie confirmer: p>
- Ensuite, vous devriez probablement utiliser un PropertyChangelistener comme suggéré ci-dessus. Soit cela ou donnez l'objet de dialogue une méthode publique qui permet aux classes extérieures la possibilité d'ajouter une action d'action au bouton de confirmation. LI>
ul>
Pour plus de détails, veuillez nous montrer des bits pertinents de votre code, voire mieux, un SSCCE . P> Par exemple, pour permettre à la classe JDialog d'accepter des auditeurs extérieurs, vous pouvez lui donner un jtextfield et un jbutton: p> xxx pré> et une méthode qui permet aux classes extérieures d'ajouter une action d'action au bouton: p> xxx pré> puis une classe extérieure peut simplement appeler la méthode `addconfirmlistener (...) pour ajouter son actionlistener à la confirmation. P>
Par exemple: P>
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;
}
}
Je pense avoir votre idée, mais maintenant, il y a un autre problème connecté: Avant d'envoyer une action à l'écoute, j'ai besoin de confirmer les données dans la boîte de dialogue lorsque vous appuyez sur le bouton de confirmation. Juste lorsque les données sont valides (lors de la fermeture de la boîte de dialogue de validité, sinon - ne sont pas), la valeur doit être lue pour d'autres actions. Je peux déclencher une sorte de notification à l'auditeur de la classe de dialogue, mais je ne sais pas comment
Ensuite, n'allez pas par le code ci-dessus. Ce que vous devez faire est de faire la boîte de dialogue modale et de faire valider les données de son bouton de confirmation et de fermer uniquement la boîte de dialogue si les données sont correctes. Demandez ensuite à votre programme principal de la classe de dialogue pour les données du code immédiatement après avoir appelé SETVisible (true) code> sur la boîte de dialogue.
@Poolas: voir Modifier pour un exemple de solution de dialogue modale ci-dessus.
J'ai fabriqué peu de méthodes publiques dans la classe de dialogue, donc je vérifie deux fois les données - dans la boîte de dialogue pour la fermeture et dans la principale pour entrer de nouvelles données. Merci les gars
Cela ne fonctionne pas, car si j'appuie sur "X" de la fenêtre, cela fonctionne comme "Confirmer" le bouton qui n'est pas un comportement prévu
JOptionPane.showMessageDialog( null, "Your warning String: I can't do that John", "Window Title", JOptionPane.ERROR_MESSAGE);
Cette réponse ne résout pas le problème optique pour résoudre.
Pourquoi ne vérifiez-vous pas si votre JDialog est visible?
yourJD.setVisible(true); while(yourJD.isVisible())try{Thread.sleep(50);}catch(InterruptedException e){}
Quelque chose s'est mal passé avec votre formatage de code. Consultez Aide Markdown - Code et texte préformaté et veuillez
J'ai mis en œuvre l'auditeur à l'intérieur JDialog et je peux écouter le bouton à l'intérieur de cette boîte de dialogue, mais j'ai besoin d'écouter ce bouton en dehors de la boîte de dialogue - dans l'application principale, où j'ai appelé cette boîte de dialogue
Pouvez-vous modifier la classe
jdialog code>? Si tel est le cas, vous pourriez transférer le
ActionEvent Code> à une autre classe qui implémente l'interface
ActionListener CODE> et cette classe peut faire ce que vous voulez.
J'ai fabriqué Addisdialog moi-même (la classe publique Addisdialog étend jdialog implémente ActionListener) alors oui, je peux le modifier. Que voulez-vous dire transmettre des actifs d'action à une autre classe? Comment puis-je le faire?
Une façon de le faire consiste à enregistrer un
PropertyChanGelistener code> à l'instance
jdialog code> et avoir l'instance
jdialog code> Utiliser un
PropertyChangeSupport code> instance qui déclenchera un événement de changement de propriété indiquant que le bouton de confirmation a été poussé.
"Ajoutez cette valeur au tableau" i> Vous pouvez passer le modèle de table à la boîte de dialogue dans le constructeur (ou implémenter un
setmodel () code> méthode dans la boîte de dialogue personnalisée). BTW - Pour une meilleure aide plus tôt, postez un SSCCE .
addisdialog.setlocacementrelativeto (null); code> devrait probablement i> être quelque chose comme
addisdialog.setlocessionrelativeto (MainApplication); Code>