9
votes

Action auditeur à JDialog pour bouton cliqué

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;


6 commentaires

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 ? Si tel est le cas, vous pourriez transférer le ActionEvent à une autre classe qui implémente l'interface ActionListener 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 à l'instance jdialog et avoir l'instance jdialog Utiliser un PropertyChangeSupport 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" Vous pouvez passer le modèle de table à la boîte de dialogue dans le constructeur (ou implémenter un setmodel () méthode dans la boîte de dialogue personnalisée). BTW - Pour une meilleure aide plus tôt, postez un SSCCE .


addisdialog.setlocacementrelativeto (null); devrait probablement être quelque chose comme addisdialog.setlocessionrelativeto (MainApplication);


3 Réponses :


14
votes

Si la boîte de dialogue disparaîtra après que l'utilisateur appuie confirmer:

  • et que vous souhaitez avoir le dialogue se comporter comme un modal em> stry> JDialog, alors c'est facile, puisque vous savez où dans le code votre programme sera dès que l'utilisateur sera dès que l'utilisateur Est fait traiter avec la boîte de dialogue - il sera juste après avoir appelé 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;
         }
      
      }
      


5 commentaires

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) 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



-2
votes
    JOptionPane.showMessageDialog(
            null,
            "Your warning String: I can't do that John",
            "Window Title",
            JOptionPane.ERROR_MESSAGE);

1 commentaires

Cette réponse ne résout pas le problème optique pour résoudre.



0
votes

Pourquoi ne vérifiez-vous pas si votre JDialog est visible?

yourJD.setVisible(true);
while(yourJD.isVisible())try{Thread.sleep(50);}catch(InterruptedException e){}


1 commentaires

Quelque chose s'est mal passé avec votre formatage de code. Consultez Aide Markdown - Code et texte préformaté et veuillez Modifier Votre message.