Java - 使用 JFileChooser 在 table 中存储字符串路径,获取设置方法?

Java - Store string paths in table with JFileChooser, get set methods?

我正在设计一个界面,用户可以在其中 select 来自 JFileChooser 的文件(通过 JButton 启动)并将其字符串路径存储在 table , 以备后用。我的 select 文件代码包含在 class TheHandler 中,我的 table 包含在 class FilePanel 中。我将 filePath 的值指向 class FilePaneltablePath,这样我就可以将字符串存储在 table 中。

但是我的问题是 tablePath returns null,我认为这是因为:

1) filePath 包含在 void 方法中

2) 在用户 select 文件

之前给 tablePath 一个值

或 1) 和 2) 的组合。所以我的问题是如何提取 filePath 的值,以便在用户 select 一个文件后,它可以被 tablePath 获取?

我在考虑 get 和 set 方法,但我才刚刚开始学习这些方法,根据我遇到的示例,我认为我需要在 actionPerformed(ActionEvent event) 构造函数中使用它们,但是如果就是这样,我完全不知道该怎么做。任何帮助将不胜感激。

TheHandler class:

public static class TheHandler implements ActionListener {
    String filePath;

    public void actionPerformed(ActionEvent event) {
        Component parent = null;
        JFileChooser chooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("TIFF Images", "tif", "tiff");
        chooser.setFileFilter(filter);
        int returnVal = chooser.showOpenDialog(parent);

        filePath = chooser.getSelectedFile().toString();
        //System.out.println(filePath);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            ImagePlus picture = IJ.openImage(filePath);
            picture.show();
        }
    }
}

FilePanel class:

public class FilePanel extends JPanel {
    public FilePanel() {
        setLayout(new GridLayout(1, 0));
        TheHandler thePath = new TheHandler();
        String tablePath = thePath.filePath;

        System.out.println(filePaths);    // outputs null, this line runs before file is chosen?

        String col[] = {"Loaded TIFF Files"};
        String[] tiffFiles = {filePaths, filePaths};   // Vector or list may be more useful?
        DefaultTableModel tableModel = new DefaultTableModel(col, 0);
        tableModel.addRow(tiffFiles);
    }
}

你的 TheHandler 是一个纯粹而简单的 ActionListener class,它的主要方法,重写的 actionPerformed 方法,只有在添加了 Handler 的组件(无论是 JButton、JMenuItem 还是不管怎样,触发它被调用。您似乎正在创建此 class 的一个实例,但我没有看到您将它添加到任何采用 ActionListeners 的组件,因此它的一个字段 filePath 将保持为空也就不足为奇了。

如果您想以更好的方式使用它,请将其用作应该使用的 ActionListener。将它添加到 JButton 或 JMenuItem,并让它在事件指示应执行操作时执行操作。如果您想收到 filePath 字段不再为空的通知,可以使用 SwingPropertyChangeSupport 将其设置为 "bound property"。

选项二是创建一个方法来执行 TheHandler 的 actionPerformed 中代码的 "meat",并在需要时直接调用它。您甚至可以让 TheHandler 调用它,这样它就可以达到双重目的。

例如,

public static class TheHandler implements ActionListener{
    String filePath;        

    public void actionPerformed(ActionEvent event){              
        String innerPath = null;
        innerPath = getFilePath();
        if (innerPath != null) {
            filePath = innerPath;
            ImagePlus picture = IJ.openImage(filePath); 
            picture.show();                                                                             
        }               
    }

    public String getFilePath() {
        String innerFilePath = null;
        Component parent = null; // better to avoid this
        JFileChooser chooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("TIFF Images", "tif","tiff");
        chooser.setFileFilter(filter);      
        int returnVal = chooser.showOpenDialog(parent);   
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            innerFilePath = chooser.getSelectedFile().toString();                                               
        }  
        return innerFilePath;
    }
}

然后你的另一个 class 可以直接调用 TheHandler 的 getFilePath() 方法。