0

私は Java でプログラミングしており、それぞれ独自のクラスの拡張である 2 つの 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 の 1 つであるボード クラスです。

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 イベント (タイマーから) の直後にあり、タイマーを少しテストしました。このヌルポインター例外が発生します。

アドバイスをいただければ幸いです。私がこれをやっている方法は少し複雑かもしれないと思います。これを行うためのより良い方法に関する提案があれば、それも役に立ちます。私の主な目標は、カード所有者を含む 1 つのメイン クラスから 2 つの別個のクラスを呼び出せるようにすることです。そうすれば、コードを分離して、すべてを分離して整理することができます。

4

1 に答える 1

3

あなたの Skeleton クラスには「メニュー」メンバーがありますが、私が見ることができる場所には設定されていません。コンストラクターは、コンストラクターに対してローカルであり、メンバーを非表示にする独自の「メニュー」ローカル変数を宣言します。コンストラクター内で「メニュー」を設定しても、メンバーは設定されません。何かを見逃していないか、同じパッケージ内の別のクラスが設定していない限り、「メニュー」メンバーが設定されている場所は他にありません。

于 2013-07-23T23:43:56.663 に答える