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

卡片布局,JFrame还是JPanel?

牟嘉
2023-03-14

我必须为学校制作一个游戏,而且我在点击jb按钮切换jpanel时遇到了一些麻烦。我想使用CardLayout,但我对Java还不熟悉,这使得它非常困难。我的目标是将我的所有面板放在不同的类中,比如类“Panel 1”,类“Panel 2”等等(而不是在我的主(JFrame)类中创建我的JPanel,这样我的代码更容易阅读)。是否可以将CardLayout容器放入包含my JFrame的类中?还有,我该把那该死的东西放在哪里?这是我的密码,希望你们能帮我!

主(JFrame)类

    package invers;

    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    public class InversMain extends JFrame implements ActionListener

     {

public CardLayout cardlayout;
public Container contentPane = this.getContentPane();
public InversMain()
{


JFrame frame = new JFrame();
frame.setLayout(cardlayout);
frame.setSize(1366,768);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Invers");
frame.setResizable(true);
frame.setVisible(true);

contentPane.setPreferredSize(new Dimension(600, 400));
    contentPane.add(new InversMainPaneel(), "Panel 1");
    contentPane.add(new InstellingenPaneel(), "Panel 2");

    settingsButton.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {
        cardlayout.show(contentPane, "Panel 1");
    }
});}


public static void main ( String [] args)
{
    new InversMain();
}
}

请注意,settingsButton是我在PANEL 1类中的按钮。因为它不是在我的主类中创建的,所以它会给出一个错误。我想参考我的设置按钮从PANEL 1类,从我的主类。这有可能吗?

面板1包含按钮的面板这是我的主菜单页

    package invers;

    import java.awt.Color;
    import java.awt.Font;
    import javax.swing.JButton;
    import javax.swing.JPanel;

    public class InversMainPaneel extends JPanel

    {

private JButton nieuwSpelKnop = new JButton("Nieuw spel");
private JButton laadSpelKnop = new JButton("Laad Spel");
private JButton settingsButton = new JButton("Settings");
private JButton handleidingKnop = new JButton("Handleiding");

public InversMainPaneel()
{

    this.setLayout(null);

    nieuwSpelKnop.setSize(300,40);
    nieuwSpelKnop.setFont(new Font("Arial", Font.BOLD, 25));
    nieuwSpelKnop.setLocation(520,250);
    nieuwSpelKnop.setVisible(true);


    laadSpelKnop.setSize(300,40);
    laadSpelKnop.setFont(new Font("Arial", Font.BOLD, 25));
    laadSpelKnop.setLocation(520,350);
    laadSpelKnop.setVisible(true);

    settingsButton.setSize(300,40);
    settingsButton.setFont(new Font("Arial", Font.BOLD, 25));
    settingsButton.setLocation(520,450);
    settingsButton.setVisible(true);

    handleidingKnop.setSize(300,40);
    handleidingKnop.setFont(new Font("Arial", Font.BOLD, 25));
    handleidingKnop.setLocation(520,550);
    handleidingKnop.setVisible(true);


    this.add(nieuwSpelKnop);
    this.add(laadSpelKnop);
    this.add(settingsButton);
    this.add(handleidingKnop);

    this.setBackground(new Color(178,143,79));
}
    }
    }

面板2,用于测试CARDLAYOUT是否工作

    package invers;
    import java.awt.Color;
    import javax.swing.JPanel;

    public class InstellingenPaneel extends JPanel
    {
public InstellingenPaneel()
{
    this.setBackground(new Color(178,143,79));
}
    }

共有2个答案

符畅
2023-03-14

请注意,settingsButton是我在PANEL 1类中的按钮。因为它不是在我的主类中创建的,所以它会给出一个错误。

我猜您得到的错误是告诉您,cardlayout在内部类中被引用,因此必须成为final。要解决此问题,只需在创建cardlayout时插入final关键字即可。

其次——是的,在单独的类中定义面板类型,然后创建这些类的实例以放置在JFrame中是完全可以接受的(并且符合最佳实践)。

第三,看起来“那该死的actionPerformed”放在了正确的位置(即作为ActionListener内部类中的一个方法),但是应该向其添加@Override注释。你知道我的意思吗?

最后,如果您想从另一个类中引用settingsButton,您有几个选项。我建议将settingsButton声明为JFrame类的实例变量,并将对JFrame的引用传递给InverseMainPanel类的构造函数

public InversMainPanel(InversMain im) {
    ...
    im.settingsButton.  //do something with the settings button.

inversemain类创建了一个inversemain面板,如下所示:

   InversMainPanel imp = new InversMainPanel(this)

使用引用调用的InversMain实例。

如果我能进一步解释这些,请告诉我。

PS:请查看关于Java命名约定的本教程

盖成弘
2023-03-14

您是否尝试过使用setContentPane方法设置JFrame contentpane?

因为我可以看到您声明了JFrame和一个内容窗格对象,但没有设置它,也没有使用面板设置它。

 类似资料:
  • 我是刚到爪哇的。我想把我的cardlayout添加到JFrame中。我之所以要这样做,是因为我可以通过关闭jframe在单击exit按钮时退出框架(窗口)。下面的程序是对JFrame的扩展。但我想声明JFrame,并在上面添加卡片。我试过了,但没有成功。我还想把card1的Jpanel设置为500(宽),500(高),但全屏显示。

  • 我试图得到一个布局就像下面的图像为一个游戏在android studio 当前我的xml是 我想在下一个级别增加更多的卡(如lvl 2)我需要为每个级别做几个布局吗?

  • 描述 (Description) 卡片HTML布局包含许多类,如下所示 - S.No 课程和描述 1 cards 这是卡片容器。 2 card-header 它是可选的卡片标题,用于显示卡片标题。 3 card-footer 它是可选的,用于指定其他信息或自定义链接。 4 card-content 它是卡内容的主要容器,是必需的。 5 card-content-inner 它是可选的附加内包装,用

  • 问题内容: 我只是编写了一个简单的代码,希望在主框架上显示一个文本字段和一个按钮,但是运行全部后,我看到的是文本字段。 如果我在文本字段后编写按钮的代码,则仅显示按钮。 知道为什么吗? 问题答案: 将组件添加到JPanel,然后将该面板添加到JFrame的ContentPane。

  • 在Go中,和之间有什么区别? 我发现两者都有效,但哪一个更好?

  • 我想知道我们是否可以有一个布局不同于其父JFrame的JPanel。例如。如果我有JFrame与边框布局,我们有一个JPanel嵌入到它,它有不同的布局。有可能吗? 我正在努力做这件事。但是这样JPanel的组件就不会显示出来了。