当前位置: 首页 > 知识库问答 >
问题:

添加来自其他类的Swing组件

司徒光霁
2023-03-14

我正在学习java,我正在尝试从另一个类向我的框架中添加一个菜单栏(练习将代码分成多个类以更好地组织程序)。

以下是我的代码示例:

public class MainApp {

public static void main(String[] args) {
    // Create window
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setSize(600, 400);

    // Create main panel
    JPanel content = new JPanel();
    content.setLayout(new BorderLayout());
    frame.add(content);

    //Create menu bar
    menubar menu = new menubar();
    content.add(menu.menuBar(), BorderLayout.NORTH);
            //Other stuff...

} // Ends main method
} // Ends MainApp class

和menubar类:

public class menubar {
public static void menuBar(){
    JMenuBar menu = new JMenuBar();
    JMenu file = new JMenu("File");
        JMenuItem clear = new JMenuItem("New");
        JMenuItem exit = new JMenuItem("Exit");
    JMenu help = new JMenu("Help");
        JMenuItem about = new JMenuItem("About");
        JMenuItem instructions = new JMenuItem("Instructions");
} // Ends method menuBar
} // Ends class menubar

我使用eclipse,在这行中:

content.add(menu.menuBar(), BorderLayout.NORTH);

“add”带下划线,因此我无法编译代码。

我一直在寻找解决这个问题的方法,据我所知,这应该是可行的。

感谢您的帮助。

非常感谢。

乔什

共有3个答案

孙朗
2023-03-14

我想你:

  • 不希望创建new menubar()如果menubar.menubar()是一个静态函数
  • 想要公共静态JMenuBar menubar(){...},而不是无效
  • 想要menubar.menubar()返回菜单否则,该方法只是一个昂贵的无操作

content.add(menu.menuBar(),...)有下划线,因为您不能使用space方法作为另一个方法的参数。

此外,应该始终使用类而不是实例引用静态字段或方法。类名应该以大写字母开头(菜单)。

有睿
2023-03-14

而不是:

content.add(menu.menuBar(), BorderLayout.NORTH);

我想你是这个意思:

content.add(menubar.menuBar(), BorderLayout.NORTH);

...但这仍然不起作用,因为此方法的返回类型是void。它必须是JMenuBar

全鸿晖
2023-03-14

请注意,menuBar()方法是一个void类型,因此没有返回任何值,而您使用的content(JPanel)的add()方法需要两个参数(JComponent type[注意JMenuBar是JComponent的子类],int[用于布局目的])

content.add(menu.menuBar(), BorderLayout.NORTH);

下面是您的代码的快速修复:

public class menubar {
public static JMenuBar menuBar(){
    JMenuBar menu = new JMenuBar();
    JMenu file = new JMenu("File");
        JMenuItem clear = new JMenuItem("New");
        JMenuItem exit = new JMenuItem("Exit");
    JMenu help = new JMenu("Help");
        JMenuItem about = new JMenuItem("About");
        JMenuItem instructions = new JMenuItem("Instructions");
    return menu;
} // Ends method menuBar
} // Ends class menubar

我给您的建议是,在Java中处理GUI时,使用继承的概念(将menubar类扩展到JMenuBar,以便您的类可以像JMenuBar一样工作),而不是依赖组合的概念。您也可以按照上面的帖子来设置JMenuBar:

frame.setJMenuBar(menu.menuBar());

如果您是Java编程的新手,您需要开始练习Java编码标准,特别是类和方法的正确命名。类名称的第一个字母应大写,而方法名称上至少应有一个动词。:)

 类似资料:
  • 问题内容: 我在3个单独的类中有3个窗口,我想使用cardLayout,以便当你单击next按钮时,将出现下一个窗口。如何将包含不同元素的JPanels添加到一个cardLayout?这是第一个窗口:(尽管唯一的区别是背景-但它代表了我实际得到它的想法) 第二个窗口: 最后一个: 问题答案: 我做了一个小程序,希望程序中写的注释可以指导你了解如何使用CardLayout。

  • 我想通过KeyClope对用户进行身份验证,但我需要向Spring Security使用的身份验证对象添加额外的角色。添加的角色保存在Postgres数据库中。 > @组件公共类Application AuthenticationProvider扩展KeycloakAuthenticationProvider{ } 尝试添加额外的过滤器,但我不确定正确的配置。 @豆子 }

  • 我正在学习JSwing,我发现了GridBagLayout。 我试图创建一个简单的计算器,我添加了多个JPanel设置每个首选大小,但当我调整窗框大小时,面板也不会调整大小。然后我发现了Gridbag的布局。 但我得到的是:GridBagLayout的计算器错误 } 应该是这样的:正确的计算器 我试过: 要锚定。。。但它不起作用, 创建多个JPanel(一个带有GridLayout),但不起作用

  • 我有以下组件,它主要依赖于react native的 我能够输入注释我自己的道具,但在上面的例子中抛出了一个错误 [flow]属性<代码>样式(在道具中找不到属性)常量样式:任意 我知道在typescript中,我可以将接口扩展到Image one,流程中是否有一些东西可以让我的道具以某种方式从继承所有类型?我如何从react native导入这些类型? 编辑我发现了一个叫做交叉点类型的概念,并尝

  • 问题内容: 我想将背景图像添加到我的JFrame中,但是当我使用下面的代码进行操作时,我无法添加其他元素,例如JLabel或JTextField。 您能否告诉我是否还有另一种方法可以将JTabbedPane添加到具有背景的JFrame中? 谢谢。 问题答案: 像这样? 附录:“通常您会先调用,但是由于图像将覆盖整个背景,因此无需这样做。” — [camickr] 如果仅创建自定义UI来添加背景图像

  • 我有以下情况。JDK 17,Spring-Boot:2.6.2。一个gradle多项目。一个项目是一个库(java-Library,没有Spring启动插件)。另一个项目是带有Spring启动插件的Spring启动应用程序。一般不使用Spring依赖管理插件,而是使用gradle平台概念。应用程序项目包括每个“实现(项目(':...” 图书馆: 库项目和spring boot应用程序项目有不同的包