带有附加 JCheckBox 的 JFileChooser 用于设置文件打开方式

JFileChooser with additional JCheckBox for setting the file opening method

我正在使用 JFileChooser 作为选择文件的组件 in this code

我需要用户的一项额外输入来触发打开文件的方式。在我的用例中,是否应将其完全读取到 RAM。

我知道我可以在其他地方询问用户,但最好是我可以将 JCheckBox 添加到 JFileChooser 对话框。我想实现图片上的效果。

我该怎么做以及如何读取用户输入的状态?

我发现最简单的方法是利用为所选文件的图像缩略图设计的机制。通过提供所谓的附件组件,它必须是 JComponent 的子 class,通过调用 JFileChooser.setAccessory 你可以在文件选择矩形的右边获得一个 space。

包括最小示例:

JFileChooser fc = new JFileChooser();
fc.setDialogTitle("Open DEN file...");
fc.setAccessory(new CheckBoxAccessory());
int returnVal = fc.showOpenDialog(frame);
CheckBoxAccessory cba = (CheckBoxAccessory)fc.getAccessory();
boolean useVirtualStack = cba.isBoxSelected();
JOptionPane.showMessageDialog(null, String.format("selected=%b", useVirtualStack));

其中 class CheckBoxAccessory 如下所示

public class CheckBoxAccessory extends JComponent {
    JCheckBox virtualCheckBox;
    boolean checkBoxInit = false;
    
    int preferredWidth = 150;
    int preferredHeight = 100;//Mostly ignored as it is  
    int checkBoxPosX = 5;
    int checkBoxPosY = 20;
    int checkBoxWidth = preferredWidth;
    int checkBoxHeight = 20;
    
    public CheckBoxAccessory()
    {
        setPreferredSize(new Dimension(preferredWidth, preferredHeight));
        virtualCheckBox = new JCheckBox("Virtual stack", checkBoxInit);
        virtualCheckBox.setBounds(checkBoxPosX, checkBoxPosY, checkBoxWidth, checkBoxHeight);
        this.add(virtualCheckBox);
    }
    
    public boolean isBoxSelected()
    {
        return virtualCheckBox.isSelected();
    }
}

结果如下

缺点是您无法使用整个组件,而只能使用一个相对较小的盒子。因此视觉效果不是我最初想要的,但如果你不是毕加索,你就不会在意。此解决方案的优点是您甚至可以对所选文件的更改做出反应,这在 https://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html#accessory

中有更详细的描述