Java分离方法和最终变量

时间:2015-01-21 13:04:52

标签: java eclipse variables compilation final

我有一个名为 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中调用的其他方法中使用,但实际上是在另一个类中。

我试图做的事情:

  • 将setPDF的参数声明为final,
  • 在Finestrella.java中将变量声明为final

但我没有运气。我理解了最终变量是什么,但是,在这一点上,我认为我的程序结构存在一些错误。我想要实现的是拥有一个干净的main()方法,只需要在另一个类中调用基本函数。

3 个答案:

答案 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(即内部类)是隔离行为的一种好方法,也更易于可读性和调试。希望这有意义(并回答你的问题)。