Java 卡片布局,JFrame还是JPanel?
我必须为学校制作一个游戏,而且我在点击jb按钮切换jpanel时遇到了一些麻烦。我想使用CardLayout,但我对Java还不熟悉,这使得它非常困难。我的目标是让我的所有面板都在不同的类中,比如类“Panel 1”,类“Panel 2”等等(而不是在我的主(JFrame)中创建我的JPanel)类,因此我的代码更容易阅读。是否可以将您的CardLayout容器放在包含我的JFrame的类中?还有,我应该将该死的ActionPerformed放在哪里?这是我的代码,希望你们能帮助我 主(JFrame)类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
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字段不可见?这是因为您desettingsButton
private。通过删除private
关键字使其包专用-这将使其可用于包中的其他类(即主面板),但仍能保护其不受包外任何类的影响。您能否向我解释如何执行此操作?