Stop Automatic Dialog Closing के बारे में एक बात यह है कि यह केवल तभी मदद करता है जब आप बंद करना या मान्य करना बंद करना चाहते हैं और फिर बंद करें ... उस ट्यूटोरियल में नमूना कोड पर समाधान का आधार बनाना I प्रमाणीकरण विफल होने पर इसे सत्यापित करने और खुले रहने के लिए नहीं मिल सका।
पीछे की ओर, मुझे लगता है कि मेरा पहला प्रयास काम नहीं करने का कारण हो सकता है क्योंकि यह JOptionPanel.createDialog() (उदाहरण कोड क्या नहीं था) का उपयोग करता है। हो सकता है कि जॉप्शनपैनल ने अपने स्वयं के जेडियलॉग को कुछ "पृष्ठभूमि" निर्भरताओं को स्थापित किया है, जिसमें इवेंट प्रोसेसिंग कैसे काम करती है ... meh। किसी भी मामले में, मुझे अब जो चाहिए था वह मिला है: डेविड क्रॉकैम्प का कोड मेरे लिए बहुत उपयोगी था।
मैं अपना समाधान पोस्ट कर रहा हूं क्योंकि यह डेविड की तुलना में PropertyChangeEvents को अलग करता है, इसलिए यह कुछ लोगों के लिए उपयोगी हो सकता है। आप देखेंगे कि अधिकतर कोड उसके लिए समान है (धन्यवाद डेविड)
यह कक्षा फ़ाइल अस्तित्व के लिए जांचती है और उपयोगकर्ता को नया नाम या रद्द करने देता है।यह कन्स्ट्रक्टर में कुछ तर्क लेता है कि यह उपयोगकर्ताओं के इनपुट को प्रमाणित करने के लिए उपयोग करता है। सत्यापन if(!Files.exists(rootPathArg.resolve(input))) { // close the dialog }
class GetPathNameDialog extends JDialog implements ActionListener, PropertyChangeListener {
/**
* contains the users input
*/
private JTextField textField;
/**
* the option pane that holds all fields and controls in this dialog
*/
private JOptionPane optionPane;
/**
* label for the left button that represents "OK"
*/
private String button1Str;
/**
* label for the right button that represents "Cancel"
*/
private String button2Str;
/**
* path containing the named entity to be renamed.
*/
private Path rootPath;
/**
* Creates the reusable dialog.
*/
/**
* Creates the dialog, panel and all GUI components, sets up listeners.
*
* @param rootPath the path where the file or folder we are renaming lives
* @param initialText the initial text to display in the text field (i.e. current name)
* @param title title of the JDialog itself
* @param textFieldWidth number of columns in the JTextField that will contain the file/folder name
* @param promptStr the propmt to display in the panel
* @param button1Str the label for the "OK" button
* @param button2Str the label for the "Cancel" button
*/
public GetPathNameDialog(Path rootPath, String initialText, String title, int textFieldWidth, String promptStr, String button1Str, String button2Str) {
super((Frame) null, true);
// init class variables
this.rootPath = rootPath;
this.button1Str = button1Str;
this.button2Str = button2Str;
setTitle(title);
textField = new JTextField(textFieldWidth);
textField.setText(initialText);
//Create an array of the text and components to be displayed.
Object[] array = {promptStr, textField};
//Create an array specifying the number of dialog buttons
//and their text.
Object[] options = {button1Str, button2Str};
//Create the JOptionPane.
optionPane = new JOptionPane(
array,
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION,
null,
options,
options[0]);
//Make this dialog display it.
setContentPane(optionPane);
//Handle window closing correctly.
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
//Ensure the text field always gets the first focus.
addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent ce) {
textField.requestFocusInWindow();
}
});
// Register an event handler that puts the text into the option pane INPUT_VALUE_PROPERTY
textField.addActionListener(this);
// Register an event handler that reacts to option pane state changes.
optionPane.addPropertyChangeListener(this);
// tell this dialog to display close to the current mouse pointer
setLocation(MouseInfo.getPointerInfo().getLocation());
pack();
}
/**
* This method handles events for the text field.
*/
@Override
public void actionPerformed(ActionEvent e) {
// this will fire a INPUT_VALUE_PROPERTY PropertyChangeEvent... takes the user input to the validaton code in the property handler
optionPane.setInputValue(textField.getText());
}
/**
* This method reacts to property changes.
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (isVisible() && (e.getSource() == optionPane)) {
// the VALUE_PROPERTY is not the same as the INPUT_VALUE_PROPERTY. we make use of the INPUT_VALUE_PROPERTY to carry our data
// but the JOptionPane uses the VALUE_PROPERTY for other stuff
if (JOptionPane.VALUE_PROPERTY.equals(prop)) {
// newValues delivered by VALUE_PROPERTY PropertyChangeEvent can be the actual labels of the button clicked,
// that's sooo counter-intuitive to me, but it's how we know which button got clicked
if (button1Str.equals(e.getNewValue())) {
// "OK" functionality...
// ...this will fire the event that takes the user input to the validation code
optionPane.setInputValue(textField.getText());
} else if (button2Str.equals(e.getNewValue())) {
// "CANCEL" functionality
optionPane.setInputValue(null);
exit();
}
} else if (JOptionPane.INPUT_VALUE_PROPERTY.equals(prop)) {
Object value = optionPane.getInputValue();
// null or empty strings in the text field (ie in the INPUT_VALUE_PROPERTY) are ignored
if (null != value && ((String) value).length() > 0) {
// here is the validation code
if (Files.exists(rootPath.resolve(textField.getText()))) {
// already exists, tell user
JOptionPane.showMessageDialog(this,
"Sorry, " + rootPath.resolve(textField.getText()).toString() + " already exists.\n\n Please enter another name.",
"OK",
JOptionPane.ERROR_MESSAGE);
// Make sure PropertyChangeEvent will fire next time...
// ...PropertyChangeEvents don't fire in setInputValue(newVal)...
// ...if newVal is equal to the current value, but if the user clicks...
// ...button 1 or hits enter in the text field without changing his text,...
// ...we still want to fire another event...
// ...so we reset the property without changing the text in the textField
optionPane.setInputValue(null);
} else {
// does not exist.. we are keeping the users input...
// ... it gets delivered to the user in getInputValue()
exit();
}
}
}
}
}
/**
* returns the users's validated input. Validated means !Files.exists(rootPath.resolve(input)).
*
* @return the text entered by the user, UNINITIALIZED_VALUE if the user X closed, null the user canceled
*/
public Object getInputValue() {
return optionPane.getInputValue();
}
/**
* closes the dialog and triggers the return from setVisible()
*/
public void exit() {
dispose();
}
}
कोड को लागू करने की है यह है:
GetPathNameDialog tempD = new GetPathNameDialog(
someFolderPath,
"theFileNameThatMustBeChanged.txt",
"Change File Name",
50,
"someFolderPath already contains a file named theFileNameThatMustBeChanged.txt." + ".\n\nPlease enter a different file name:",
"Copy the file with the new name", "Do not copy the file");
tempD.setVisible(true);
Object inputObj = tempD.getInputValue();
String input = (inputObj == JOptionPane.UNINITIALIZED_VALUE || null == inputObj ? "" : (String) inputObj);
if (input.length() > 0) {
// we now have a new file name. go ahead and do the copy or rename or whatever...
}
क्या विधि आप उपयोग कर रहे हैं? showConfirmDialog, showInputDialog? –
मैं जेडियलॉग के निर्माण डियालॉग या सेटकंटेंटपेन का उपयोग कर रहा हूं लेकिन अगर मैं – bioMind