gpt4 book ai didi

java - 禁用 JFileChooser 中的打开按钮?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:30:00 24 4
gpt4 key购买 nike

我扩展了一个 JFileChooser 并覆盖了 approveSelection 方法,这样当用户选择一个无效的目录然后点击打开按钮时,一个错误消息在 >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 () );

编辑:我找到了一种禁用按钮的方法,方法是遍历组件并获取打开按钮的句柄: http://www.coderanch.com/t/468663/GUI/java/Disabling-Enabling-level-button-folder

例子:

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);
}
}
}

关于java - 禁用 JFileChooser 中的打开按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14061450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com