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

Java中的基本JPanel/JFrame类问题

盖向荣
2023-03-14

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

我在主课上写了相当大一部分的游戏,效果很好,但过了一段时间就变得一团糟了。

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

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

-因此,我只是在一个类中构建了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);

    }
}

我在另一个类中创建了一个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。和...我不明白怎么做。

我试着在main Frame类中添加menuPanel类作为一个对象,这样我就可以html" target="_blank">添加JPanel,但是它不起作用。然后我尝试了一系列其他的解决方案,但是没有什么真正帮助我。

附言:我知道我没有在代码中添加任何布局管理器或任何其他东西,因为我想让代码对于问题来说非常简单。

共有2个答案

乐正宏深
2023-03-14

你很接近。您必须能够从主菜单类中获取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;
    }
    
}
唐海阳
2023-03-14

所以,如果你想为mainMenu创建一个单独的类,你应该让它扩展JPanel。这样,大型机类就可以实例化它。

以下是我将要告诉你们的关于我在swing中构建东西的经验教训:

>

  • 您(几乎)永远不需要一个单独的类来创建一个JFrame。如果您创建一个扩展JPanel的类,那么在静态方法(如main)中创建一个JFrame就足够容易了。也就是说,如果您也想使用JLayeredPane或想在JMenuBar上添加菜单,可能会有子类化JFrame的情况。不子类化JFrame的好处是它可以更容易地将您的JPanel粘贴到JFrame、JDialog(通过JOptionPane)或JWindow中。

    除非您有一个您认为在其他应用程序中可能有用的组件,否则您应该在一个类中构建整个GUI,并将该类用作控制器。可以在其他应用程序中使用的组件示例是什么?那一天,我上了一堂“颜色按钮”秋千课,用来挑选颜色。这个组件有一个自包含的模型,有自己的控制器和一个获取所选颜色的API。(https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/ex/)这使得它可以重复使用。但是,通常情况下,你正在构建的GUI的元素在你在该类中所做的工作之外是不可重用的。

    话虽如此,对于您上面发布的代码:您的主菜单JPanel在类外是无法访问的,所以这可能是一个问题。正如我在上面一段中所说的,如果您不确定您正在创建的组件是否可以在其他地方使用,那么最好将整个视图模型建筑与控制器放在同一类中

  •  类似资料:
    • 问题内容: 我正在学习Java gui。我学会了创建窗口的方法是继承或扩展类,并且很好地使用它,因为它包含窗口的所有属性。现在,如果要在此窗口中添加一些内容,则需要使用方法。但是今天我碰到了一个窗口,我们可以通过添加东西。 两种方法有什么区别?它们之间有某种联系吗? 问题答案: 您不应不必要地扩展该类(仅当您向该类添加其他功能时) JFrame : 扩展和。 它是一个顶层容器,用于表示窗口的最低要

    • 我正在学习Java GUI。我学习创建窗口的方法是继承或扩展类,使用它是很好的,因为包含窗口的所有属性。现在如果我想在这个窗口中添加一些东西,我需要使用方法。但是今天我遇到了,它也创建了一个windows,我们可以通过添加内容。 这两种方法有什么区别?他们有什么关系吗?

    • 我已经将我的JPanel派生类添加到JFrame中。现在,当我想画一个椭圆(在我的JPanel的paintComponent方法中使用fillOval)时,我看到正在绘制两个椭圆。当我调用super时,问题消失了。paintComponent,或者当我在JFrame类中调用setContentPane并将我的JPanel作为参数时。问题是,为什么会这样?当然,当JPanel和JFrame的左上角位

    • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?

    • 我正在做一个GUI任务,我遇到了一个我无法解决的问题。我有一个带有多个JPanels的JFrame,其中一个JPanels包含一个带有多个JPanels的CardLayout。由于我们有更多的人在这个项目中工作,我们决定为CardLayout中的每个面板创建一个单独的类(扩展JPanel)。 问题是从JPanel类访问JFrame的组件。 举个例子,我在JFrame中的某个地方有一个JLabel,