我有用于重命名文件的重命名对话框
String renameTo = JOptionPane.showInputDialog(gui, "New Name", currentFile.getName());
它以这种方式工作,但是我有一个问题。 问题是我用文件扩展名设置了默认值 但我只想选择文件名。
sample : my file name = yusuf.png
我只想选择yusuf之类的
答案 0 :(得分:1)
JOptionPane
内部有很多事情,这是使其强大的原因之一,也使其变得有些呆板。
两个迫在眉睫的问题显而易见...
JTextField
JOptionPane
希望控制首次显示对话框时哪些组件具有焦点。设置JTextField
实际上很简单...
String text = "yusuf.png";
int endIndex = text.lastIndexOf(".");
JTextField field = new JTextField(text, 20);
if (endIndex > 0) {
field.setSelectionStart(0);
field.setSelectionEnd(endIndex);
} else {
field.selectAll();
}
这基本上将选择从String
开始到最后一个.
的所有文本,或者如果找不到.
则选择所有文本。
现在困难的部分是从JOptionPane
撤回焦点控制
// Make a basic JOptionPane instance
JOptionPane pane = new JOptionPane(field,
JOptionPane.PLAIN_MESSAGE,
JOptionPane.OK_CANCEL_OPTION,
null);
// Use it's own dialog creation process, it's simpler this way
JDialog dialog = pane.createDialog("Rename");
// When the window is displayed, we want to "steal"
// focus from what the `JOptionPane` has set
// and apply it to our text field
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) {
// Set a small "delayed" action
// to occur at some point in the future...
// This way we can circumvent the JOptionPane's
// focus control
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
field.requestFocusInWindow();
}
});
}
});
// Put it on the screen...
dialog.setVisible(true);
dialog.dispose();
// Get the resulting action (what button was activated)
Object value = pane.getValue();
if (value instanceof Integer) {
int result = (int)value;
// OK was actioned, get the new name
if (result == JOptionPane.OK_OPTION) {
String newName = field.getText();
System.out.println("newName = " + newName);
}
}
然后,我们用手指交叉,最终得到了类似...
我个人将其包装在一个很好的可重用的类/方法调用中,该类/方法根据用户的操作返回新文本或null
,但这就是我
有没有更简单的方法?
当然,我只是想向您展示最困难的解决方案……(讽刺)……这就是为什么我建议将其包装在它自己的实用程序类中,以便以后可以重用它的原因>