Java showInputDialog选择自定义文本

时间:2018-08-09 22:45:16

标签: java swing joptionpane

我有用于重命名文件的重命名对话框

String renameTo = JOptionPane.showInputDialog(gui, "New Name", currentFile.getName());

它以这种方式工作,但是我有一个问题。 问题是我用文件扩展名设置了默认值 但我只想选择文件名。

sample : my file name = yusuf.png

我只想选择yusuf之类的

like this

1 个答案:

答案 0 :(得分:1)

JOptionPane内部有很多事情,这是使其强大的原因之一,也使其变得有些呆板。

两个迫在眉睫的问题显而易见...

  1. 您无法直接访问用于从用户那里获取输入的JTextField
  2. 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);
    }
}

然后,我们用手指交叉,最终得到了类似...

Example

我个人将其包装在一个很好的可重用的类/方法调用中,该类/方法根据用户的操作返回新文本或null,但这就是我

  

有没有更简单的方法?

当然,我只是想向您展示最困难的解决方案……(讽刺)……这就是为什么我建议将其包装在它自己的实用程序类中,以便以后可以重用它的原因