Java:如何使用具有多个类的持卡人

时间:2013-07-23 22:46:26

标签: java swing jframe jpanel structure

我正在用Java编程,试图使用持卡人在2个JPanel之间切换,每个JPanel都是他们自己的类的扩展。我想我理解了基本概念,但是当我调用这些类时,我在当前版本中遇到了错误。我得到一个空指针异常,我认为这是一个结构性问题,但我不确定如何或为什么。

主要方法指向此类

public class Skeleton implements ActionListener{

JPanel cardHolder;
CardLayout cards;
String cardA = "A";
String cardB = "B";

JPanel Jboard;
JPanel Jmenu;

JFrame frame2;

Board board;
Menu menu;

boolean menuSet;
boolean boardSet;

Timer timer;

public class Switcher implements ActionListener{
String card;

Switcher(String card){
    this.card = card;
}

@Override
public void actionPerformed(ActionEvent e) {
        cards.show(cardHolder, card);
}
}

public Skeleton(JFrame frame){

    JPanel menu = new Menu();
    JPanel board = new Board();

    JFrame frame2 = frame;

    timer = new Timer(5, this);
    timer.start();

    cardHolder = new JPanel();
    cards = new CardLayout();
    cardHolder.setLayout(cards);
    cardHolder.add(menu, cardA);
    cardHolder.add(board, cardB);
    frame2.add(cardHolder);
    frame2.revalidate();
    frame2.setVisible(true);

}

public JFrame getSkeleton(){
    return frame2;
}

public JPanel getCardHolder(){
    return cardHolder;
}

public void checkStatus(){
    if (menuSet == true){
        new Switcher(cardB);
        boardSet = false;
    }
    if (boardSet == true){
        new Switcher(cardA);
        menuSet = false;
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    menuSet = menu.getMenuset();
    boardSet = board.getBoardset();
    checkStatus();  
}

}

这是棋盘类,我试图在

之间切换的JPanel之一
public class Board extends JPanel{

boolean boardset;
Menu menu = new Menu();

public Board(){
setBackground(Color.WHITE);
}

public JPanel getPanel(){
    return this;
}

public void setBoardset(boolean x){
    boardset = x;
}

public boolean getBoardset(){
    return boardset;
}
}

这是另一个JPanel类,它包含一个用于切换到另一个JPanel类的按钮。这也是JPanel最初使用的原始版本。

public class Menu extends JPanel implements ActionListener{

boolean menuset;

public Menu(){

    setBackground(Color.BLACK);

    JButton button = new JButton("hello");  
    button.addActionListener(this);
    this.add(button);
}

public JPanel getPanel(){
    return this;
}

@Override
public void actionPerformed(ActionEvent e) {
    menuset = true;
}

public void setMenuset(boolean x){
    menuset = x;
}

public boolean getMenuset(){
    return menuset;
}
}

就像我说的,我得到一个空指针异常。它出现在Skeleton()类的这一行

menuSet = menu.getMenuset();

上面的行就在上面的actionPerformed事件之后(来自计时器),我已经测试了一点定时器,它可以用来做基本的打印语句,但每当我尝试使用里面的'menu'或'board'实例时actionPerformed,我得到这个空指针异常。

我很感激任何建议。我明白我这样做的方式可能有点令人费解。如果有人对更好的方法有任何建议,这也会有所帮助。我的主要目标是能够从一个包含持卡人的主类中调用2个单独的类。这样我就可以将代码分开,以便将所有内容保持隔离并按顺序排列。

1 个答案:

答案 0 :(得分:3)

你的Skeleton类有一个“菜单”成员,但它没有设置在我能看到的任何地方。构造函数声明它自己的“menu”局部变量,它是构造函数的本地变量并隐藏成员。在构造函数中设置“menu”不会设置成员。我没有看到设置“menu”成员的任何其他地方,除非我遗漏了某些东西或者除非同一个包中的另一个类正在设置它。