我正在关注有关如何创建自定义对话框的Oracle教程:http
:
//docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
我有两个按钮:“保存对象”和“删除对象”,单击它们应执行一段代码。不幸的是,我似乎无法向JOptionPane按钮添加任何ActionListener,因此单击它们时什么也没有发生。
谁能帮我告诉我该怎么做?这是到目前为止对话框的类:
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
方法可以为您完成所有这些工作…
现在,如果您担心必须完成对话框的所有设置,那么我将编写一个实用程序方法,该方法可以完全完成对话框或采用必需的参数…但这就是我
更新
不知道为什么我不早想到…
而不是传递数组String
作为options参数,而是传递的数组JButton
。这样,您可以附加自己的侦听器。
options-一组对象,指示用户可以做出的可能选择; 如果对象是组件,则可以正确渲染它们
;非字符串对象使用其toString方法呈现;如果此参数为null,则选项由外观决定
我是JFrame的新手,我想知道为什么我的JOptionPane不会停止弹出。当我连续输入JOptionPane时,在JFrame上的值与前面的值重叠,这使我的程序处于循环中,防止打印过程打开。我认为这是因为程序在一个公共void类中而不是在一个公共静态void主类中请求输入值,但我不知道如何将这些值放在一个JFrame上,否则,由于图形组件的原因。
介绍 (Introduction) JOptionPane类是一个组件,它提供标准方法来弹出值的标准对话框或通知用户某些内容。 Class 声明 (Class Declaration) 以下是javax.swing.JOptionPane类的声明 - public class JOptionPane extends JComponent implements Accessible
问题内容: 有谁知道为什么选项卡(\ t)与JOptionPane.showMessageDialog不兼容? 我的代码如下: 还有其他方法可以在JOptionPane中对齐文本吗? 问题答案: 将选项卡式文本放入JTextArea
主要内容:1 Java JOptionPane的介绍,2 Java JOptionPane的声明,3 Java JOptionPane的构造方法,4 Java JOptionPane的方法,5 Java JOptionPane的案例1,6 Java JOptionPane的案例2,7 Java JOptionPane的案例3,8 Java JOptionPane的案例41 Java JOptionPane的介绍 JOptionPane类用于提供标准对话框,例如消息对话框,确认对话框和输入对话框。
我正在用Java创建一个基于Tic Tac Toe GUI的游戏,并且正在努力使用的2D数组。到目前为止,我已经能够创建可供选择的按钮: 从最后几行代码中可以看到,我正在尝试找出如何判断按钮何时被按下,以便例如,如果用户单击“A1”(因此是0,0),那么程序可以输出文本(我将把它改为JOptionPane格式)。 希望我解释得不错。
问题内容: 如何指定JOptionPane的位置。任何人都可以制作一个扩展JOptionPane.showInputDialog的类,该类也处于x,y位置吗? 问题答案: 您可以使用JOptionPane的setLocation(…)方法。或代替使用,可以扩展JDialog,然后在屏幕上指定它的位置。 这是@HovercraftFullOfEels建议的一个工作代码示例,仅此示例将帮助您根据需要从