Java 如何将菜单方法外包给单独的类?

Java 如何将菜单方法外包给单独的类?,java,swing,Java,Swing,昨天我开始用JavaSwing编写程序。在此之前,我只用java编写了一些小的控制台程序 我把程序的主菜单放在与主方法不同的类中。现在我想为选项菜单添加一个按钮,并将它执行的代码放入自己的类中,这样在主菜单类中,我只需调用选项菜单方法 我被卡住了。如果我直接在主菜单的类中编写选项菜单的代码,那么一切都可以正常工作。但是,一旦我将选项菜单的方法外包给一个单独的类,我就不能调用外包方法 也许你能帮助我 以下是点击选项按钮时应执行的代码: public class CPP_Frame extends

昨天我开始用JavaSwing编写程序。在此之前,我只用java编写了一些小的控制台程序

我把程序的主菜单放在与主方法不同的类中。现在我想为选项菜单添加一个按钮,并将它执行的代码放入自己的类中,这样在主菜单类中,我只需调用选项菜单方法

我被卡住了。如果我直接在主菜单的类中编写选项菜单的代码,那么一切都可以正常工作。但是,一旦我将选项菜单的方法外包给一个单独的类,我就不能调用外包方法

也许你能帮助我

以下是点击选项按钮时应执行的代码:

public class CPP_Frame extends JFrame {

        JButton SettingsButton = new JButton("Options");
        SettingsButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                CPP_Frame OptionsMenu = new CPP_Frame();
                OptionsMenu.OptionsMenuLoader();
            }
        });
    }
这是选项菜单类中的代码,将由“OptionsMenuLoader”调用:

public class Options_Menu extends JFrame {

    protected void OptionsMenuLoader() {
        CPP_Frame OptionsMenu = new CPP_Frame();
        OptionsMenu.setSize(new Dimension(400, 500));
        OptionsMenu.setVisible(true);
        OptionsMenu.setTitle("Options");
        OptionsMenu.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
我哪里弄错了,或者我尝试编写代码的方式是否可能。 我希望我已经详细解释了我的问题。
提前感谢。

我在这里可以看到一些潜在的问题,我对swing的知识不是太多,所以如果我错了,请纠正我,我只是从编程的角度来看这个问题

首先,将
选项menuloader()
声明为受保护的方法。这意味着if只能由与其相同的类中的方法调用,或由其派生的类调用

因此,要调用
选项菜单加载程序
它必须与
操作执行
覆盖处于同一个类中,否则CPP\u框架必须继承Options\u菜单,我认为这是错误的

如果这在swing格式中是可能的,一个解决方案是将“OptionsMenuLoader()”公开

其次,我不确定为什么这不会产生错误,您在
选项菜单上调用
选项菜单加载程序()
,虽然这看起来不错,但您将
选项菜单
声明为
CPP_框架
,而不是
选项菜单
类型。这不应该起作用,因为
CPP\u Fram
e没有这样的方法
选项menuloader()

我认为您的目标是创建一个包含选项菜单的CPP框架。单击不同CPP帧中的按钮时创建的

在这种情况下,您必须在操作上创建一个
Options\u菜单
,而不是CPP框架。然后,您可以在此新菜单上调用
options menu.options menuloader()
方法

public class CPP_Frame extends JFrame {

        JButton SettingsButton = new JButton("Options");
        SettingsButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                Options_Menu OptionsMenu = new Options_Menu();
                OptionsMenu.OptionsMenuLoader();
            }
        });
    }

我可以在这里看到一些潜在的问题,我对swing不是太了解,所以如果我错了,请纠正我,我只是从编程的角度来看这个问题

首先,将
选项menuloader()
声明为受保护的方法。这意味着if只能由与其相同的类中的方法调用,或由其派生的类调用

因此,要调用
选项菜单加载程序
它必须与
操作执行
覆盖处于同一个类中,否则CPP\u框架必须继承Options\u菜单,我认为这是错误的

如果这在swing格式中是可能的,一个解决方案是将“OptionsMenuLoader()”公开

其次,我不确定为什么这不会产生错误,您在
选项菜单上调用
选项菜单加载程序()
,虽然这看起来不错,但您将
选项菜单
声明为
CPP_框架
,而不是
选项菜单
类型。这不应该起作用,因为
CPP\u Fram
e没有这样的方法
选项menuloader()

我认为您的目标是创建一个包含选项菜单的CPP框架。单击不同CPP帧中的按钮时创建的

在这种情况下,您必须在操作上创建一个
Options\u菜单
,而不是CPP框架。然后,您可以在此新菜单上调用
options menu.options menuloader()
方法

public class CPP_Frame extends JFrame {

        JButton SettingsButton = new JButton("Options");
        SettingsButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                Options_Menu OptionsMenu = new Options_Menu();
                OptionsMenu.OptionsMenuLoader();
            }
        });
    }

请提供您的整个计划。无论如何,我建议您阅读一篇关于Java中的继承、重写、多态、抽象、封装、接口和包以及何时和如何使用的教程。您可以从这里开始:您还应该阅读什么是构造函数,在这里可以找到:您的应用程序应该只有一个JFrame。您可以创建多个JPanel来显示不同的内容。您也可以使用JDialogs。您问题中的代码不可编译。我认为你应该阅读,如果你使用它,也应该阅读,这将使其他人更容易阅读和理解你的代码。请提供你的整个程序。无论如何,我建议您阅读一篇关于Java中的继承、重写、多态、抽象、封装、接口和包以及何时和如何使用的教程。您可以从这里开始:您还应该阅读什么是构造函数,在这里可以找到:您的应用程序应该只有一个JFrame。您可以创建多个JPanel来显示不同的内容。您也可以使用JDialogs。您问题中的代码不可编译。我认为你应该阅读,如果你使用它,你也应该阅读,这将使其他人更容易阅读和理解你的代码。谢谢你的回答。这有助于我理解我的问题。你是对的。这解决了问题。非常感谢你。但是关于“protected”:我之所以使用它,是因为——至少我是这样了解的——protected的访问级别是类、包和子类。选项菜单和CPP框架类在同一个包中,所以我想我可以使用protected。就使用protected而言,如果代码与具有受保护访问权限的方法一起工作,那么我想你可能是对的。老实说,我很少找到一个真正需要使用受保护方法的理由,所以我不知道关于它们的一切。谢谢你的回答。这有助于我理解我的问题。你是对的。这解决了问题。非常感谢你。但是关于“受保护的”:我
public class Options_Menu extends JFrame {

    public void OptionsMenuLoader() {
        CPP_Frame OptionsMenu = new CPP_Frame();
        OptionsMenu.setSize(new Dimension(400, 500));
        OptionsMenu.setVisible(true);
        OptionsMenu.setTitle("Options");
        OptionsMenu.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}