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