ActionListener sur JOptionPane
Je suis l'Oracle tutoriel sur la façon de créer une boîte de dialogue personnalisée: http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
J'ai deux boutons: Enregistrer l'Objet et Supprimer des Objets qui quand on clique dessus, à exécuter un morceau de code. Malheureusement je n'arrive pas à ajouter toute ActionListener à la JOptionPane boutons donc quand ils sont cliqué rien ne se passe.
Peut aider quelqu'un me dire comment je peux faire? Ici, c'est la classe que j'ai pour la boîte de dialogue jusqu'à présent:
class InputDialogBox extends JDialog implements ActionListener, PropertyChangeListener {
private String typedText = null;
private JTextField textField;
private JOptionPane optionPane;
private String btnString1 = "Save Object";
private String btnString2 = "Delete Object";
/**
* Returns null if the typed string was invalid;
* otherwise, returns the string as the user entered it.
*/
public String getValidatedText() {
return typedText;
}
/** Creates the reusable dialog. */
public InputDialogBox(Frame aFrame, int x, int y) {
super(aFrame, true);
setTitle("New Object");
textField = new JTextField(10);
//Create an array of the text and components to be displayed.
String msgString1 = "Object label:";
Object[] array = {msgString1, textField};
//Create an array specifying the number of dialog buttons
//and their text.
Object[] options = {btnString1, btnString2};
//Create the JOptionPane.
optionPane = new JOptionPane(array,
JOptionPane.PLAIN_MESSAGE,
JOptionPane.YES_NO_OPTION,
null,
options,
options[0]);
setSize(new Dimension(300,250));
setLocation(x, y);
//Make this dialog display it.
setContentPane(optionPane);
setVisible(true);
//Handle window closing correctly.
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
/*
* Instead of directly closing the window,
* we're going to change the JOptionPane's
* value property.
*/
optionPane.setValue(new Integer(
JOptionPane.CLOSED_OPTION));
}
});
//Ensure the text field always gets the first focus.
addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent ce) {
textField.requestFocusInWindow();
}
});
//Register an event handler that puts the text into the option pane.
textField.addActionListener(this);
//Register an event handler that reacts to option pane state changes.
optionPane.addPropertyChangeListener(this);
}
/** This method handles events for the text field. */
public void actionPerformed(ActionEvent e) {
optionPane.setValue(btnString1);
System.out.println(e.getActionCommand());
}
/** This method reacts to state changes in the option pane. */
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (isVisible()
&& (e.getSource() == optionPane)
&& (JOptionPane.VALUE_PROPERTY.equals(prop) ||
JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) {
Object value = optionPane.getValue();
if (value == JOptionPane.UNINITIALIZED_VALUE) {
//ignore reset
return;
}
//Reset the JOptionPane's value.
//If you don't do this, then if the user
//presses the same button next time, no
//property change event will be fired.
optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);
if (btnString1.equals(value)) {
typedText = textField.getText();
String ucText = typedText.toUpperCase();
if (ucText != null ) {
//we're done; clear and dismiss the dialog
clearAndHide();
} else {
//text was invalid
textField.selectAll();
JOptionPane.showMessageDialog(
InputDialogBox.this,
"Please enter a label",
"Try again",
JOptionPane.ERROR_MESSAGE);
typedText = null;
textField.requestFocusInWindow();
}
} else { //user closed dialog or clicked delete
//Delete the object ...
typedText = null;
clearAndHide();
}
}
}
/** This method clears the dialog and hides it. */
public void clearAndHide() {
textField.setText(null);
setVisible(false);
}
J'allais dire que je pensais que vous n'avez pas mélangé certains des concepts dans ce tutoriel. L'idée d'incorporer un JOptionPane personnalisé dans un JDialog me semble étrange. Qu'est-ce que le résultat souhaité ici? Devrait appuyez sur le bouton modifier ce composant, ou d'une autre?
OriginalL'auteur user1521881 | 2012-10-10
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes à côté de la question de la
JOptionPane
. Il est livré avec la capacité de montrer que c'est propre boîte de dialogue...Le faire manuellement, vous allez avoir à faire un peu plus de travail.
Tout d'abord, vous allez avoir à écouter le panneau de changement de propriété d'événements, à la recherche de changements à la
JOptionPane.VALUE_PROPERTY
et ignorant tout de la valeur deJOptionPane.UNINITIALIZED_VALUE
...Une fois que vous constatez le changement, vous devrez disposer de votre boîte de dialogue.
Vous devez extraire la valeur qui a été sélectionné par le
JOptionPane#getValue
méthode, qui renvoie unObject
. Vous devez interrompre le sens de cette valeur vous-même...Inutile de dire que,
JOptionPane.showXxxDialog
méthodes de faire tout cela pour vous...Maintenant, si vous inquiet d'avoir à passer par l'ensemble de l'installation de la boîte de dialogue, allais-je écrire une méthode utilitaire qui soit fait complètement ou a pris les paramètres requis...mais c'est juste moi
Mis à JOUR
Ne sais pas pourquoi je n'ai pas pensé plus tôt...
Au lieu de passer un tableau de
String
que le paramètre options, passer un tableau deJButton
. De cette façon, vous pouvez attacher vos propres auditeurs.OriginalL'auteur MadProgrammer
Pour la flexibilité que vous semblez vouloir vous devriez avoir votre classe étendre JFrame au lieu de JDialog. Ensuite déclarer vos boutons comme JButtons:
JButton saveButton = new JButton("Enregistrer"); et ajouter un actionListnener à ce bouton:
saveButton.addActionListener();
soit vous pouvez mettre un nom de classe à l'intérieur de la parenthèse de la saveButton, ou vous pouvez tout simplement passer le mot-clé " ce " et de déclarer une méthode actionPerformed pour encapsuler le code qui doit s'exécuter lorsque le bouton est pressé.
Voir ce lien pour un JButton tutoriel avec plus de détails:
http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html
JFrame
ne fournit pas de modalité, dans tous les cas, nous devrions éviter (si possible) s'étendant à partir de haut niveau conteneursOriginalL'auteur loveToCode