Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

NullPointerException

null値を参照しているために起きるエラーであることは分かったのですが、直すことができません。以下にプログラムとエラーを載せるので、ご教授願います。
(初めてのプログラミングのため見にくいとは思いますが、宜しくお願いします。)

プログラム:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class ren2 extends JFrame   {
    Container    container = null;
    JPanel        mainPanel, cardPanel;
    JButton        btn20, btn21,btn22,btn23,btn24,btn25;
    JButton        btn30, btn31, btn32;
    int        iScreen;
    JButton        btn0, btn1;
    CardLayout     layout ;
    JPanel        panel21;
    BorderLayout    border ;
    JPanel    p21 = new JPanel();
    JPanel    p22 = new JPanel();
    JPanel    p23 = new JPanel();

    public ren2 (String title) {

        super(title);

        JPanel        panel1, panel2, panel3;
        JPanel        panel22, panel23;
        JLabel        label01,label10, label11;
        JPanel        p31 = new JPanel();
        JPanel        p32 = new JPanel();
        JPanel        p33 = new JPanel();
        JPanel        btnPanel;
        JLabel        c0, c1, c2, c3, c4;
        JLabel        label30,label31,label32,label33,label34,label35,label36,label37;
        JLabel        label300,label301,label302,label303,label304,label305,label306;
        JLabel        label307,label308,label309,label310,label311,label312,label313;
/*
        下記した初期化をfor文を用いて行いたかったのですが、分かりませんでした
        String        label[] = new String[14];
        for(int i = 300; i < 314; i++){
             label[i] = JLabel("");
        }
*/
        label300 = new JLabel("");
        label301 = new JLabel("");
        label302 = new JLabel("");
        label303 = new JLabel("");
        label304 = new JLabel("");
        label305 = new JLabel("");
        label306 = new JLabel("");
        label307 = new JLabel("");
        label308 = new JLabel("");
        label309 = new JLabel("");
        label310 = new JLabel("");
        label311 = new JLabel("");
        label312 = new JLabel("");
        label313 = new JLabel("");
        c0 = new JLabel("");
        c1 = new JLabel("");
        c2 = new JLabel("");
        c3 = new JLabel("");
        c4 = new JLabel("");

        container = this.getContentPane();
        layout = new CardLayout(10, 10);
        border = new BorderLayout();
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();


//画面上のパネル切り替え用ボタンの作成
        iScreen = 1; 
        mainPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(1, 2, 2, 2));

        btn0 = new JButton("");
        btn0.setPreferredSize(new Dimension(320, 30));
        mainPanel.add(btn0);
        btn0.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(iScreen > 1){
                    if(iScreen == 2){
                        btn0.setText("");
                        btn1.setText("注文画面へ");
                    }
                    else {
                        btn0.setText("メイン画面へ戻る");
                        btn1.setText("確認画面へ");
                    }
                    iScreen = iScreen - 1;
                    ((CardLayout) cardPanel.getLayout()).previous(cardPanel);
                }
            }
        });
        btn1 = new JButton("注文画面へ");
        btn1.setPreferredSize(new Dimension(320, 30));
        mainPanel.add(btn1);
        btn1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(iScreen < 3){
                    if(iScreen == 1){
                        btn0.setText("メインへ");
                        btn1.setText("確認画面へ");
                    }
                    else if(iScreen == 2){
                        btn0.setText("注文画面へ戻る");
                        btn1.setText("会計画面へ");
                    }
                    iScreen = iScreen + 1;
                    ((CardLayout) cardPanel.getLayout()).next(cardPanel);
                }
            }
        });

        cardPanel = new JPanel();
        cardPanel.setLayout(layout);
//メイン画面
        panel1 = new JPanel();
        panel1.setLayout(new GridLayout(1, 2, 2, 2));
        label10 = new JLabel("○○書店",JLabel.CENTER);
        panel1.add(label10);
        label11 = new JLabel("購入システム",JLabel.CENTER);
        panel1.add(label11);

//注文画面
        //Panel移動用ボタン
        btn20 = new JButton("教材");
        btn20.addActionListener(new MyActionListener());
        btn20.setActionCommand("1");
        btn21 = new JButton("辞書");    
        btn21.addActionListener(new MyActionListener());
        btn21.setActionCommand("2");
        btn22 = new JButton("漫画");    
        btn22.addActionListener(new MyActionListener());
        btn22.setActionCommand("3");
        btn23 = new JButton("小説");    
        btn23.addActionListener(new MyActionListener());
        btn23.setActionCommand("4");
        btn24 = new JButton("参考書");    
        btn24.addActionListener(new MyActionListener());
        btn24.setActionCommand("5");

        // ボタンを追加
        JPanel panel20 = new JPanel();
        panel20.setLayout(new GridLayout(1, 5, 5, 5));
        panel20.add(btn20);
        panel20.add(btn21);
        panel20.add(btn22);
        panel20.add(btn23);
        panel20.add(btn24);
            
        // ジャンル1
        JPanel panel01 = new JPanel(new FlowLayout());
        panel01.add(new JLabel("パネル1"));
        // ジャンル2
        JPanel panel02 = new JPanel(new FlowLayout());
        panel02.add(new JLabel("パネル2"));
        // ジャンル3
        JPanel panel03 = new JPanel(new FlowLayout());
        panel03.add(new JLabel("パネル3"));
        // ジャンル4
        JPanel panel04 = new JPanel(new FlowLayout());
        panel04.add(new JLabel("パネル4"));
        // ジャンル5
        JPanel panel05 = new JPanel(new FlowLayout());
        panel05.add(new JLabel("パネル5"));

        // パネルを追加
        JPanel panel21 = new JPanel();
        panel21.setLayout(layout);
        panel21.add(panel01, "1");
        panel21.add(panel02, "2");
        panel21.add(panel03, "3");
        panel21.add(panel04, "4");
        panel21.add(panel05, "5");

        JLabel Point = new JLabel("教材はポイント2倍、辞書はポイント3倍です。");
        JLabel c = new JLabel("選択したもの",JLabel.CENTER);
        JPanel  choice = new JPanel();
        choice.setLayout(new GridLayout(1, 2, 5, 5));

        //選択されたTextを読み込む
        c0.setText(c.getText());
        c1.setText(c.getText());
        c2.setText(c.getText());
        c3.setText(c.getText());
        c4.setText(c.getText());
        choice.add(c0);
        choice.add(c1);
        choice.add(c2);
        choice.add(c3);
        choice.add(c4);

        //パネル配置
        panel2 = new JPanel();
        panel2.setLayout(gbl);
            gbc.gridx = 0;
           gbc.gridy = 0;
        gbc.gridheight = 1; 
        gbc.weighty = 1.0d;
            gbl.setConstraints(p21, gbc);
        gbc.gridy = 1;
        gbc.weighty = 6.0d;
        gbl.setConstraints(p22, gbc);
        gbc.gridy = 2;
        gbc.weighty = 1.0d;
        gbl.setConstraints(p23, gbc);
        panel2.add(p21);
        panel2.add(p22);
        panel2.add(p23);
        p21.setLayout(new GridLayout(2, 1, 2, 2));
        p21.add(Point);
        p21.add(panel20);
        p22.add(panel21);
        p23.setLayout(new GridLayout(2, 1, 2, 2));
        p23.add(c);
        p23.add(choice);
        
//確認画面
        //テキスト
        label30 = new JLabel("注文品");
        label31 = new JLabel("金額");
        label32 = new JLabel("小計");
        label33 = new JLabel("支払い金額");
        label34 = new JLabel("現在のポイント");
        label35 = new JLabel("獲得ポイント");
        label36 = new JLabel("合計ポイント");
        label37 = new JLabel("100");

        //panel2で選択されたTextを読み込む(今は途中のため適当な物を入れています)
        label300.setText(c.getText());
        label301.setText(c.getText());
        label302.setText(c.getText());
        label303.setText(c.getText());
        label304.setText(c.getText());
        label305.setText(c.getText());
        label306.setText(c.getText());
        label307.setText(c.getText());
        label308.setText(c.getText());
        label309.setText(c.getText());
        label310.setText(c.getText());
        label311.setText(c.getText());
        label312.setText(c.getText());
        label313.setText(c.getText());

        //パネル配置
        panel3 = new JPanel();
        panel3.setLayout(gbl);
        gbc.gridx = 0;
           gbc.gridy = 0;
        gbc.gridheight = 1; 
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weighty = 2.0d;
            gbl.setConstraints(p31, gbc);
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weighty = 1.0d;
        gbl.setConstraints(p32, gbc);
        gbc.gridy = 2;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weighty = 1.0d;
        gbl.setConstraints(p33, gbc);
        panel3.add(p31);
        panel3.add(p32);
        panel3.add(p33);
        p31.setLayout(new GridLayout(6, 2, 5, 5));
        p31.add(label30);
        p31.add(label31);
        p31.add(label300);
        p31.add(label301);
        p31.add(label302);
        p31.add(label303);
        p31.add(label304);
        p31.add(label305);
        p31.add(label306);
        p31.add(label307);
        p31.add(label308);
        p31.add(label309);
        p32.setLayout(new GridLayout(2, 2, 5, 5));
        p32.add(label32);
        p32.add(label310);        
        p32.add(label33);
        p32.add(label311);
        p33.setLayout(new GridLayout(3, 2, 5, 5));
        p33.add(label34);
        p33.add(label37);
        p33.add(label35);
        p33.add(label312);
        p33.add(label36);
        p33.add(label313);
//画面配置
        cardPanel.add("First", panel1);
        cardPanel.add("Second", panel2);
        cardPanel.add("Third", panel3);
        container.add("North", mainPanel);
        container.add("Center", cardPanel);
        this.setLocation(200, 100);
        this.setSize(640, 480);
        this.setVisible(true);
    }

    class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e){
            String cmd = e.getActionCommand();
            if (cmd.equals("1")){
                // 1枚目のカード
                layout.show(panel21, "1");
            }else if (cmd.equals("2")){
                // 2枚目のカード
                layout.show(panel21, "2");
            }else if (cmd.equals("3")){
                // 3枚目のカード
                layout.show(panel21, "3");
            }else if (cmd.equals("4")){
                // 4枚目のカード
                layout.show(panel21, "4");
            }else if (cmd.equals("5")){
                // 5枚目のカード
                layout.show(panel21, "5");
            }
        }
    }

    public static void main(String[] args) {
        ren2 frame = new ren2("ren2");
        // 閉じるボタンをクリックされた場合の動作を設定
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

エラー:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at java.awt.CardLayout.show(Unknown Source)
        at ren2$MyActionListener.actionPerformed(ren2.java:305)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
以下、Unknown Sourceばかりです。

305行目のlayout.show(panel21, "1");のpanel21に問題があると思うのですが、どうすればpanel21に加えたpanel01,panel02,panel03,panel04,panel05に切り替えられるでしょうか?なお、現在はlabelを加えていますが、後でGridLayout()にする予定です。

4

回答

80808

閲覧

4件の回答

評価

0

このコードを読む限り
class MyActionListener
内に書かれている
panel21は全部nullよ

167行目のpanel21を作成しているとこが原因

評価

0

167行目のpanel21を作成しているとこが原因であるのは予想がついていたのですが、どのようにしたらMyActionListenerの所に反映させる事が出来るのでしょうか?

Panelを追加している場所が悪いのか、そもそもやり方が違うのかすら分かっていません。
おそらく、後者であるだろうとは思っているのですが、教科書やインターネットで検索して、色々と試してみたのですが、分かりませんでした。

お手数をおかけしますが、167行目付近のプログラムをどのようにすればいいかご教授願います。

評価

0

このプログラム中では、
panel21が、ふたつあるんだよ。
ひとつはクラス変数。もう一つはローカル変数。

評価

0

てんこ様、不良社員様、アドバイスをありがとうございました。

167行目とプログラム中にpanel21がふたつあるという回答のおかげで無事に問題を解決することが出来ました。

本当にありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。