Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡片布局,JFrame还是JPanel?_Java_Swing_Jpanel_Jbutton_Cardlayout - Fatal编程技术网

Java 卡片布局,JFrame还是JPanel?

Java 卡片布局,JFrame还是JPanel?,java,swing,jpanel,jbutton,cardlayout,Java,Swing,Jpanel,Jbutton,Cardlayout,我必须为学校制作一个游戏,而且我在点击jb按钮切换jpanel时遇到了一些麻烦。我想使用CardLayout,但我对Java还不熟悉,这使得它非常困难。我的目标是让我的所有面板都在不同的类中,比如类“Panel 1”,类“Panel 2”等等(而不是在我的主(JFrame)中创建我的JPanel)类,因此我的代码更容易阅读。是否可以将您的CardLayout容器放在包含我的JFrame的类中?还有,我应该将该死的ActionPerformed放在哪里?这是我的代码,希望你们能帮助我 主(JFra

我必须为学校制作一个游戏,而且我在点击jb按钮切换jpanel时遇到了一些麻烦。我想使用CardLayout,但我对Java还不熟悉,这使得它非常困难。我的目标是让我的所有面板都在不同的类中,比如类“Panel 1”,类“Panel 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,用于测试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));
}
    }
请注意,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:

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


因为我可以看到您声明JFrame和contentpane对象,但没有设置它,或者使用面板设置它。

请将代码的格式设置得更好,它几乎不可读。这里有一个工作或参考。我已将我的cardlayout设置为最终版本,并添加了如下覆盖:@override public void actionPerformed(ActionEvent e){//TODO自动生成的方法存根}不过,我不知道您将行粘贴到哪个类:“公共InversMainPanel(InversMain im){…im.settingsButton.”或放置在哪里:“InversMainPanel imp=new InversMainPanel(this)”
“公共InversMainPanel(InversMain im)”{
是InverseMainPanel类的构造函数-您将用它替换其当前构造函数
“public inverseMainPanel(){``,从现在开始,无论何时创建新的
InverseMainPanel`都必须传递对
InverseMain
实例的引用。
InverseMainPanel imp=new InverseMainPanel(此)“
InverseMain
类中创建
InverseMainPanel
的任何地方,请查看命名约定教程。在我的主面板中,我在按钮中添加了imp.settingsButton,但现在它给我一个错误,InverseMainPanel.settingsButton字段不可见?这是因为您de
settingsButton
private。通过删除
private
关键字使其包专用-这将使其可用于包中的其他类(即主面板),但仍能保护其不受包外任何类的影响。您能否向我解释如何执行此操作?