【问题标题】:Basic JPanel/JFrame class problem in JavaJava中的基本JPanel/JFrame类问题
【发布时间】:2021-12-28 17:19:41
【问题描述】:

不久前我开始通过教程和视频学习 Java,在了解了一些东西(按钮、布局、音频和其他一些东西是如何工作的)之后,我现在的目标之一是创建一个小的交互式游戏。

我在 Main Class 中编写了相当大的游戏部分,运行良好,但一段时间后就变得混乱了。

所以我决定再试一次,从一开始就为游戏的每个部分使用不同的类,以使代码看起来更清晰易懂。

但是我从一开始就有一个问题,经过几个小时在论坛上搜索教程、答案并没有找到准确的答案,我认为如果你能准确地看到我的问题是最好的(这很简单!)

-所以我只是在一个类中构建了 JFrame(我只使用主类来启动框架,它工作正常):

import javax.swing.*;
import java.awt.*;

public class principalFrame {

    public principalFrame(){

        JFrame mainFrame = new JFrame();
        mainFrame.setVisible(true);
        mainFrame.setSize(1200,750);
        mainFrame.getContentPane().setBackground(Color.BLACK);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setResizable(false);

    }
}

我在 another 类中创建了一个 JPanel:

import javax.swing.*;
import java.awt.*;

public class mainMenu{

    public mainMenu(){

        JPanel menuPanel = new JPanel();

        menuPanel.setSize(300,300);
        menuPanel.setBackground(Color.BLUE);

    }
}

我的目标是在 JFrame 中添加 JPanel。而且...我不明白该怎么做。

我尝试将 menuPanel 类作为一个对象添加到 mainFrame 类中,这样我就可以添加 JPanel,但它不起作用。然后从我阅读的旧问题中尝试了一堆其他解决方案,但没有任何帮助。

PS:我知道我没有在此处的代码中添加任何布局管理器或任何其他内容,因为我想让代码对问题保持非常简单。

【问题讨论】:

  • 我建议你学习MVC

标签: java swing class jframe jpanel


【解决方案1】:

所以如果你想为 mainMenu 创建一个单独的类,你应该让它扩展 JPanel。这样,您的 mainFrame 类就可以对其进行实例化。

以下是我在摇摆中构建事物的经验教训:

  1. 您(几乎)永远不需要单独的类来创建 JFrame。如果您创建一个扩展 JPanel 的类,则很容易在静态方法(如 main)中创建一个 JFrame 以放入您的 JPanel。话虽如此,如果您还想使用 JLayeredPane 或想在JMenuBar,可能存在继承 JFrame 的情况。 子类化 JFrame 的优点是它可以更轻松地将 JPanel 粘贴到 JFrame、JDialog(通过 JOptionPane)或 JWindow 中。

  2. 除非您有一个您认为可能在其他应用程序中有用的组件,否则您应该在一个类中构建您的整个 GUI,并将该类用作Controller。可以在其他应用程序中使用的组件的示例是什么?过去,我做了一个“ColorButton”摇摆类,用于颜色选择。这个组件有一个独立的模型,有自己的控制器和一个 API 来获取选择的颜色。 (https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/ex/) 使其可重复使用。但通常情况下,您正在构建的 GUI 元素除了您在该类中所做的事情之外,并不能真正重用。

话虽如此,对于您在上面发布的代码: 您的 mainMenu JPanel 在课堂外无法访问,因此这可能是一个问题。正如我在上一段中所说,如果您不确定您正在创建的组件是否可以在其他地方使用,最好将整个 viewmodel 建筑物与 @987654325 放在同一类中@

【讨论】:

    【解决方案2】:

    你很亲密。您必须能够从 MainMenu 类中获取 JPanel

    JFrame 方法必须按特定顺序调用。这是我用于 Swing 应用程序的顺序。

    类名以大写字符开头。

    这是您编写MainMenu 类的一种方法。

    public class PrincipalFrame {
    
        public PrincipalFrame() {
            JFrame mainFrame = new JFrame();
            mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             
            mainFrame.add(new MainMenu().getMenuPanel(), BorderLayout.CENTER);
             
            mainFrame.setSize(1200, 750);
            mainFrame.setResizable(false);
            mainFrame.setVisible(true);
        }
    }
    
    public class MainMenu {
    
        private final JPanel menuPanel;
    
        public MainMenu() {
            this.menuPanel = new JPanel();
            this.menuPanel.setPreferredSize(300, 300);
            this.menuPanel.setBackground(Color.BLUE);
        }
    
        public JPanel getMenuPanel() {
            return menuPanel;
        }
        
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-04
      • 2011-06-29
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2011-05-25
      • 2013-03-04
      相关资源
      最近更新 更多