gpt4 book ai didi

java - JOptionPane 上的 ActionListener

转载 作者:搜寻专家 更新时间:2023-11-01 01:13:42 24 4
gpt4 key购买 nike

我正在学习有关如何创建自定义对话框的 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.UNINITIALIZED_VALUE 的任何值...

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

您需要提取通过 JOptionPane#getValue 方法选择的值,该方法返回一个 Object。您将不得不自己打断该值的含义...

不用说,JOptionPane.showXxxDialog 方法会为您完成这一切...

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

已更新

不知道为什么我没有早点想到...

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

options - an array of objects indicating the possible choices the user can make; if the objects are components, they are rendered properly; non-String objects are rendered using their toString methods; if this parameter is null, the options are determined by the Look and Feel

关于java - JOptionPane 上的 ActionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com