ActionListener on JOptionPane

I follow the Oracle tutorial on creating a custom dialog: http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

I have two buttons: Save the object and Delete the object, which when clicked should execute a specific piece of code. Unfortunately, I cannot add any ActionListener to the JOptionPane buttons, so when they are clicked, nothing will happen.

Can someone help me tell how I can do this? Here is the class I have for the dialog box:

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 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); } 
+4
source share
2 answers

I think you are missing the JOptionPane point. It comes with the ability to display its own dialog ...

 public class TestOptionPane02 { public static void main(String[] args) { new TestOptionPane02(); } public TestOptionPane02() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JTextField textField = new JTextField(10); String btnString1 = "Save Object"; String btnString2 = "Delete Object"; //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}; int result = JOptionPane.showOptionDialog(null, array, "", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, "New Object", options, options[0]); switch (result) { case 0: System.out.println("Save me"); break; case 1: System.out.println("Delete me"); break; } } }); } } 

To do this manually, you will need to do a little work.

First, you will need to listen for the panel property change events, look for changes in JOptionPane.VALUE_PROPERTY and ignore any JOptionPane.UNINITIALIZED_VALUE value ...

Once you find the change, you will need to delete your dialog.

You will need to retrieve the value that was selected using the JOptionPane#getValue , which returns an Object . You will have to interrupt the meaning of this value yourself ...

Needless to say, the JOptionPane.showXxxDialog do all this for you ...

Now, if you are worried about having to go through all the dialog settings, I would write a utility method that completely or completely fulfilled the required parameters ... but that's just me

UPDATED

I donโ€™t know why I didnโ€™t think about it before ...

Instead of passing the String array as the options parameter, pass the JButton array. This way you can join your listeners.

options - an array of objects indicating the possible choices the user can make; if the objects are components, they are displayed correctly ; objects other than String are rendered using toString methods; if this parameter is null, the parameters are determined using the Look and Feel function

+13
source

For flexibility, you seem to want your class to extend JFrame instead of JDialog. Then declare your buttons as JButtons: JButton saveButton = new JButton ("Save"); and add actionListnener to this button: saveButton.addActionListener (); either you can put the class name in the bracket of saveButton, or just pass the keyword 'this' to it and declare a method called actionPerformed to encapsulate the code that should be executed when the button is clicked. See this link for a JButton tutorial for more details: http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

0
source

Source: https://habr.com/ru/post/1439011/


All Articles