【问题标题】:CardLayout, in JFrame or JPanel?CardLayout,在 JFrame 或 JPanel 中?
【发布时间】:2013-04-15 12:58:49
【问题描述】:

我必须为学校制作一个游戏,我在通过单击 JButton 来切换 JPanel 时遇到了一些麻烦。我想使用 CardLayout,但我是 Java 新手,这很难。我的目标是将我的所有面板放在不同的类中,例如“面板 1”类、“面板 2”类等(而不是在我的主(JFrame)类中创建我的 JPanel,所以我的代码更容易阅读。是吗?可以将您的 CardLayout 容器放在包含我的 JFrame 的类中吗?还有,我该把该死的 ActionPerformed 放在哪里?这是我的代码,希望你们能帮助我!

主(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 类中引用我的 settingsButton。这可能吗?

面板 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,用于测试卡片布局是否有效

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

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

【问题讨论】:

  • 请更好地格式化你的代码,它很难读
  • 这是一个有效的example,或参考。

标签: java swing jpanel jbutton cardlayout


【解决方案1】:

您是否尝试过使用 setContentPane 方法设置 JFrame 内容窗格?

因为我可以看到你声明了 JFrame 和一个 contentpane 对象,但没有设置它,或者用你的面板设置它。

【讨论】:

  • 你能给我解释一下怎么做吗?
【解决方案2】:

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

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

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

第三,你似乎在正确的地方有“那个该死的 actionPerformed”(即作为你的 ActionListener 内部类中的一个方法),但你应该向它添加 @Override 注释。你知道我的意思吗?

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

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

InversMain 类创建了一个InversMainPanel,如下所示:

   InversMainPanel imp = new InversMainPanel(this)

this 指的是正在从中进行调用的InversMain 实例。

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

PS:Check out this tutorial on Java naming conventions

【讨论】:

  • 我已经完成了我的卡片布局,并添加了这样的覆盖:@Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 } 不过,我不知道在您粘贴哪个类:“public InversMainPanel(InversMain im){ ... im.settingsButton。”或放在哪里:'InversMainPanel imp = new InversMainPanel(this)'
  • "public InversMainPanel(InversMain im) { 是 InversMainPanel 类的构造函数 - 您将替换其当前构造函数 "public InversMainPanel() {`` with it, and from now on whenever you create a new InversMainPanel`,您必须传递对 InversMain 实例的引用。 InversMainPanel imp = new InversMainPanel(this)' 可以在 InversMain 类中的任何位置创建 InversMainPanel
  • 请看关于命名约定的教程
  • 好的,在我的主面板中,我将 imp.settingsButton 添加到了我的按钮中,但现在它给了我一个错误,即 InversMainPanel.settingsButton 字段不可见?
  • 那是因为您已将 settingsButton 设为私有。通过删除 private 关键字使其成为包私有 - 这将使其可用于包中的其他类(即 MainPanel),但仍保护它免受包外的任何类的影响。
猜你喜欢
  • 2012-10-21
  • 2023-03-26
  • 2011-07-08
  • 2012-03-21
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
相关资源
最近更新 更多