java – 在JFileChooser中禁用“打开”按钮?
发布时间:2020-12-15 04:59:41 所属栏目:Java 来源:网络整理
导读:我扩展了一个JFileChooser并覆盖了approveSelection方法,这样当用户选择一个无效的目录然后单击Open按钮时,将显示JOptionPane中的错误消息.但是我想让我的JFileChooser更加用户友好,并且当用户点击无效目录然后在用户点击有效目录时重新启用时,将打开按钮.是
我扩展了一个JFileChooser并覆盖了approveSelection方法,这样当用户选择一个无效的目录然后单击Open按钮时,将显示JOptionPane中的错误消息.但是我想让我的JFileChooser更加用户友好,并且当用户点击无效目录然后在用户点击有效目录时重新启用时,将打开按钮.是否可以进一步自定义我的JFileChooser并访问“打开”按钮,以便我可以相应地更改按钮的状态(可能通过侦听目录选择的侦听器)?
public class MyFileChooser extends JFileChooser { private final JFrame mainFrame; public MyFileChooser(JFrame mainFrame) { this.mainFrame = mainFrame; setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } @Override public void approveSelection() { if (/* directory is valid */) { super.approveSelection(); return; } JOptionPane.showMessageDialog(mainFrame,"Invalid directory","Error",JOptionPane.ERROR_MESSAGE); } } 解决方法
您可以通过在检测到文件/目录上的任何选择更改时调用chooser.setControlButtonsAreShown(false)来隐藏接受/取消按钮:
myChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); myChooser.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(evt.getPropertyName())) { File file = (File) evt.getNewValue(); if (file != null && file.isFile()) { // your condition myChooser.setControlButtonsAreShown(false); } else if ( file != null ) { System.out.println(file.getName()); myChooser.setControlButtonsAreShown(true); } } myChooser.repaint(); } }); 但它可能会使用户感到困惑,更好地制作自定义FileFilter并只显示您需要的文件/目录: public static class MyDirectoryFilter extends javax.swing.filechooser.FileFilter { @Override public boolean accept( File file ) { return file.isDirectory() && customeCondition(file) ; } @Override public String getDescription() { return "this only my custom dir"; } } myChooser.setFileFilter( new MyDirectoryFilter () ); 编辑: 例: myChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); myChooser.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(evt.getPropertyName())) { File file = (File) evt.getNewValue(); if (file != null && file.isFile()) { setOpenButtonState(myChooser,false); } else if ( file != null ) { setOpenButtonState(myChooser,true); System.out.println(file.getName()); } } myChooser.repaint(); } }); public static void setOpenButtonState(Container c,boolean flag) { int len = c.getComponentCount(); for (int i = 0; i < len; i++) { Component comp = c.getComponent(i); if (comp instanceof JButton) { JButton b = (JButton) comp; if ( "Open".equals(b.getText()) ) { b.setEnabled(flag); } } else if (comp instanceof Container) { setOpenButtonState((Container) comp,flag); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |