0

我对这种方法的工作方式有以下疑问:

protected JButton createToolbarButton(String name, final String id, final JPanel panel)
{   
    JButton button = new JButton(name);     // Create a new JButton

    // If the passed Jpanel named "panel" exist, add this to the JPanel named content (the CardLayout container)
    if (panel != null)
        content.add(panel, id);
    else
        button.setEnabled(false);       // Otherwise disable this button

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //System.out.println(panel.getClass());
            if (panel instanceof SchedulingPanel)
                ((SchedulingPanel)panel).getTasksSettings().fireSettingsUpdated();
            else if (panel instanceof EventsPanel)
                ((EventsPanel)panel).refreshPanel();
            else if (panel instanceof ConfigurationPanel)
                ((ConfigurationPanel)panel).refreshPane();

            showSection(id);
        }
    });

    return button;
}

我有这个名为CreateToolbarButton的方法,它有一些输入参数,包括String id参数。

正如您在此方法中看到的,我将ActionListener 内部类添加到我的 JButton 对象(处理此按钮上的单击事件)。

在此ActionListener 内部类中,它被声明为处理单击事件的actionPerformed()方法,并在此方法的末尾调用showSection(id)方法,将 id 参数传递给似乎createToolbarButton( )输入参数。

所以在我看来,在我的ActionListener 内部类中,我还可以看到容器方法的参数和变量(createToolbarButton()

这样对吗?为什么?我觉得有点奇怪

肿瘤坏死因子

安德烈亚

4

2 回答 2

1

是的,你确实有知名度。这是由这些变量是最终的事实来保证的。换句话说,由于它们没有改变,内部类不会尝试引用一个在方法 createToolbarButton 完成时可能会死掉的变量。

如果您认为这种行为很奇怪并且您不希望这样做,那么不要使用内部类。请改用普通的第一级课程。

于 2013-11-12T17:41:52.690 回答
1

在我看来,在我的ActionListener内部类中,我也可以看到容器方法(createToolbarButton())的参数和变量,对吗?

绝对 - 您确实可以看到传递给该方法的所有局部变量参数,只要有人声明它们final(就像您所做的那样)。

为什么?我觉得有点奇怪

这是匿名类没有构造函数的设计结果。这种隐式捕获局部变量和参数的能力使您可以编写不需要匿名类具有构造函数的代码。

但实际上,您的匿名类确实有一个构造函数。final由于您从方法实现的主体中引用它们而需要捕获的所有本地变量都将成为此不可见构造函数的参数。编译器隐式传递这些参数以及this对封闭类的引用,然后在引用它们的方法体中插入对这些捕获属性的引用。

于 2013-11-12T17:41:53.347 回答