我正在设计一个界面,用户可以在其中使用 JFileChooser
选择文件(通过 JButton
启动)并将其字符串路径存储在表中,以供以后使用。我用于选择文件的代码包含在类 TheHandler
中,我的表格位于类 FilePanel
中。我将 filePath
的值定向到 FilePanel
类的 tablePath
,以便我可以将字符串存储在表中。
但是我的问题是 tablePath
返回 null
,我认为这是因为:
1) filePath
包含在 void
方法中
2) 在用户选择文件之前为tablePath
赋予一个值
或 1) 和 2) 的组合。所以我的问题是如何提取 filePath
的值,以便在用户选择文件后可以由 tablePath
获取它?
我正在考虑 get 和 set 方法,但我刚刚开始学习这些方法,从我遇到的示例来看,我认为我需要在 actionPerformed(ActionEvent event) 中使用它们
构造函数,但如果是这样的话,我完全不知道如何做到这一点。任何帮助将不胜感激。
TheHandler
类:
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
类:
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类,它的主要方法,即重写的actionPerformed方法,只有在添加了The Handler的组件(无论是JButton、JMenuItem还是其他什么)触发其被调用时才会被调用。您似乎正在创建此类的一个实例,但我没有看到您将其添加到任何采用 ActionListener 的组件中,因此它的一个字段 filePath 将保持为 null 也就不足为奇了。
如果你想以更好的方式使用它,那么将它用作 ActionListener 应该被使用。将其添加到 JButton 或 JMenuItem,并让它在事件指示应执行操作时执行其操作。如果您希望收到 filePath 字段不再为空的通知,您可以使用 SwingPropertyChangeSupport 将其设为“绑定(bind)属性”。
选项二是创建一个方法来执行 TheHandler 的 actionPerformed 中代码的“主要部分”,并在需要时直接调用该方法。您甚至可以让 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;
}
}
然后您的其他类可以直接调用 TheHandler 的 getFilePath()
方法。
关于Java - 使用 JFileChooser 将字符串路径存储在表中,获取设置方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779145/