Java 分离方法和最终变量
Java separate methods and final variables
我有一个名为 Finestrella.java 的 Java class,我在其中声明了两个私有变量:
private File selectedPDF
private String selectedPDFName
在 main 中,我有以下代码,一旦单击按钮,就会将这些变量与 ActionListener 一起使用:
JButton btnNewButton = new JButton("Select PDF File");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JFileChooser fc = new JFileChooser(System.getProperty("user.home") + System.getProperty("file.separator") + "Desktop");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Select a PDF Document", "pdf");
fc.setFileFilter(filter);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedPDF = fc.getSelectedFile();
selectedPDFName = selectedPDF.getName();
} else {
// Executed when no file selected
}
}
});
由于这只是全部代码的一部分,我考虑将其全部放在另一个名为 Functions.java
的 class 中
static public void setPDF (JFrame myFrame, File selectedPDF, String selectedPDFName) {
// the code I wrote before
}
并在 Finestrella.java 中调用它:
Functions.setPDF(myFrame, selectedPDF, selectedPDFName);
当然,我得到一个错误,因为它说 selectedPDF 和 selectedPDFName 必须声明为 final。问题是,变量是在 Finestrella.java 中创建的,但我的方法是在 Functions.java 中。此外,我需要这两个变量以便稍后在将在 Finestrella.java 中调用的其他方法中使用,但实际上它们在另一个 class.
中
我尝试做的事情:
- 将 setPDF 的参数声明为最终参数,
- 在 Finestrella.java
中将变量声明为 final
但我没有运气。我明白什么是最终变量,但在这一点上,我认为我的程序结构肯定有问题。我想要实现的是拥有一个干净的 main() 方法,其中仅包含位于另一个 class.
中的基本函数调用
我建议你写一个方法 returns a File
:
public static File setPDF (JFrame myFrame) {
...
return fc.getSelectedFile();
}
并如图所示使用它:
selectedPDF = setPDF(...);
selectedPDFName = selectedPDF.getName();
然后你应该提取你的内部 class 并从新的 class 中获取字段;出现该错误的唯一原因是它 必须 为 final
才能访问内部 class 中的字段。像,
static class MyListener implements ActionListener {
private File selectedPDF;
private String selectedPDFName;
public File getSelectedPDF() {
return selectedPDF;
}
public String getSelectedName() {
return selectedPDFName;
}
public void actionPerformed(ActionEvent arg0) {
JFileChooser fc = new JFileChooser(System.getProperty("user.home")
+ System.getProperty("file.separator") + "Desktop");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Select a PDF Document", "pdf");
fc.setFileFilter(filter);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedPDF = fc.getSelectedFile();
selectedPDFName = selectedPDF.getName();
} else {
// Executed when no file selected
}
}
}
然后
JButton btnNewButton = new JButton("Select PDF File");
MyListener my = new MyListener();
btnNewButton.addActionListener(my);
您可以通过实施 ActionListener 简单地创建一个新的 class。这样,您就可以拥有自己的 class 来处理 Action 项目。
public class MyActionItem implements ActionListener {
private File selectedPDF
private String selectedPDFName
// Usual defs
public void setPDF(JFrame myFrame, File selectedPDF, String selectedPDFName){
// Your working code
}
...
...
...
}
我在这里没有使用静态方法,但是使用静态方法是可以的,因为您的 class 设计不需要您实例化操作 class 来使用 setter 方法。
在大型和模块化 Swing 应用程序中,使用您自己的操作项而不是 lambda(即内部 classes)是隔离行为的好方法,也更易于阅读和调试。希望这是有道理的(也能回答你的问题)。
我有一个名为 Finestrella.java 的 Java class,我在其中声明了两个私有变量:
private File selectedPDF
private String selectedPDFName
在 main 中,我有以下代码,一旦单击按钮,就会将这些变量与 ActionListener 一起使用:
JButton btnNewButton = new JButton("Select PDF File");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JFileChooser fc = new JFileChooser(System.getProperty("user.home") + System.getProperty("file.separator") + "Desktop");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Select a PDF Document", "pdf");
fc.setFileFilter(filter);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedPDF = fc.getSelectedFile();
selectedPDFName = selectedPDF.getName();
} else {
// Executed when no file selected
}
}
});
由于这只是全部代码的一部分,我考虑将其全部放在另一个名为 Functions.java
的 class 中static public void setPDF (JFrame myFrame, File selectedPDF, String selectedPDFName) {
// the code I wrote before
}
并在 Finestrella.java 中调用它:
Functions.setPDF(myFrame, selectedPDF, selectedPDFName);
当然,我得到一个错误,因为它说 selectedPDF 和 selectedPDFName 必须声明为 final。问题是,变量是在 Finestrella.java 中创建的,但我的方法是在 Functions.java 中。此外,我需要这两个变量以便稍后在将在 Finestrella.java 中调用的其他方法中使用,但实际上它们在另一个 class.
中我尝试做的事情:
- 将 setPDF 的参数声明为最终参数,
- 在 Finestrella.java 中将变量声明为 final
但我没有运气。我明白什么是最终变量,但在这一点上,我认为我的程序结构肯定有问题。我想要实现的是拥有一个干净的 main() 方法,其中仅包含位于另一个 class.
中的基本函数调用我建议你写一个方法 returns a File
:
public static File setPDF (JFrame myFrame) {
...
return fc.getSelectedFile();
}
并如图所示使用它:
selectedPDF = setPDF(...);
selectedPDFName = selectedPDF.getName();
然后你应该提取你的内部 class 并从新的 class 中获取字段;出现该错误的唯一原因是它 必须 为 final
才能访问内部 class 中的字段。像,
static class MyListener implements ActionListener {
private File selectedPDF;
private String selectedPDFName;
public File getSelectedPDF() {
return selectedPDF;
}
public String getSelectedName() {
return selectedPDFName;
}
public void actionPerformed(ActionEvent arg0) {
JFileChooser fc = new JFileChooser(System.getProperty("user.home")
+ System.getProperty("file.separator") + "Desktop");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Select a PDF Document", "pdf");
fc.setFileFilter(filter);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedPDF = fc.getSelectedFile();
selectedPDFName = selectedPDF.getName();
} else {
// Executed when no file selected
}
}
}
然后
JButton btnNewButton = new JButton("Select PDF File");
MyListener my = new MyListener();
btnNewButton.addActionListener(my);
您可以通过实施 ActionListener 简单地创建一个新的 class。这样,您就可以拥有自己的 class 来处理 Action 项目。
public class MyActionItem implements ActionListener {
private File selectedPDF
private String selectedPDFName
// Usual defs
public void setPDF(JFrame myFrame, File selectedPDF, String selectedPDFName){
// Your working code
}
...
...
...
}
我在这里没有使用静态方法,但是使用静态方法是可以的,因为您的 class 设计不需要您实例化操作 class 来使用 setter 方法。
在大型和模块化 Swing 应用程序中,使用您自己的操作项而不是 lambda(即内部 classes)是隔离行为的好方法,也更易于阅读和调试。希望这是有道理的(也能回答你的问题)。