JOptionPane上的ActionListener

我正在关注如何创建自定义对话框的Oracle教程: http : //docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

我有两个按钮:Save Object和Delete Object,点击它们时应执行某段代码。 不幸的是,我似乎无法将任何ActionListener添加到JOptionPane按钮,所以当它们被点击时没有任何反应。

任何人都可以帮我告诉我如何做到这一点? 这是我到目前为止对话框的类:

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

我想你错过了JOptionPane的观点。 它具有显示自己的对话框的能力……

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

要手动完成,你将不得不做更多的工作。

首先,您将不得不听取面板的属性更改事件,查找JOptionPane.VALUE_PROPERTY更改并忽略JOptionPane.VALUE_PROPERTY任何值…

一旦检测到更改,您将需要处理对话框。

您将需要提取通过JOptionPane#getValue方法选择的值,该方法返回一个Object 。 你必须自己打断这个价值的含义……

毋庸置疑, JOptionPane.showXxxDialog方法为您完成所有这些……

现在,如果您担心必须完成对话框的所有设置,我会编写一个实用程序方法,要么完全执行它,要么采用所需的参数…但这只是我

更新

不知道为什么我没想到它…

不是传递一个String数组作为options参数,而是传递一个JButton数组。 这样您就可以附加自己的监听器。

options – 一个对象数组,指示用户可以做出的选择; 如果对象是组件,则它们被正确呈现 ; 非String对象使用其toString方法呈现; 如果此参数为null,则选项由外观确定

为了您希望的灵活性,您应该让您的类扩展JFrame而不是JDialog。 然后将您的按钮声明为JButton:JButton saveButton = new JButton(“Save”); 并向此按钮添加一个actionListnener:saveButton.addActionListener(); 您可以将类名放在saveButton的括号内,也可以简单地传递关键字’this’并声明一个名为actionPerformed的方法来封装按下按钮时应该执行的代码。 有关更多详细信息,请参阅此链接以获取JButton教程: http : //docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html