我有一个名为 Finestrella.java 的Java类,其中我声明了两个私有变量:
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
的类中。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中调用的其他方法中使用,但实际上是在另一个类中。
我试图做的事情:
但我没有运气。我理解了最终变量是什么,但是,在这一点上,我认为我的程序结构存在一些错误。我想要实现的是拥有一个干净的main()方法,只需要在另一个类中调用基本函数。
答案 0 :(得分:4)
然后你应该提取你的内部类并从新类中获取字段;得到该错误的唯一原因是因为必须为final
才能访问内部类中的字段。像,
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);
答案 1 :(得分:0)
我建议你写一个返回File
的方法:
public static File setPDF (JFrame myFrame) {
...
return fc.getSelectedFile();
}
并按如下所示使用它:
selectedPDF = setPDF(...);
selectedPDFName = selectedPDF.getName();
答案 2 :(得分:0)
您可以通过实现ActionListener来创建一个新类。通过这种方式,您可以拥有自己的类来处理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
}
...
...
...
}
我这里没有使用静态方法,但是可以使用静态方法,因为你的类设计并不要求你实例化动作类来使用setter方法。
在大型和模块化Swing应用程序中,使用您自己的操作项而不是lambdas(即内部类)是隔离行为的一种好方法,也更易于可读性和调试。希望这有意义(并回答你的问题)。