プロが教える店舗&オフィスのセキュリティ対策術

私が普段プログラムを書いてコンパイルすると、ほぼ確実といってもいいくらいにおかしなことが起きます。
ボタンを配置して、処理を書きます(ここではJTableが現れるという処理にします)、そしてコンパイルします、コンパイルは通ります、ウィンドウが現れます、ボタンを押したら処理が起きてJTableが現れるはずなのですが、ボタンを押すとコマンドプロンプトでわけわからん英語や数字が現れます(出力される)。
自分の書いたプログラムをeclipseでコピペしても、問題はありませんでした。
コマンドプロンプトを一度消して、直ったプログラムもあります。また、その逆に何度やっても直らないものもあります。

↓私の書いたプログラムです。おかしいところ等がありましたらご指摘下さい。また解答者様のPCでコピペして、試してみて下さい。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Sukejuru extends JFrame implements ActionListener {
JPanel p;
public static void main(String args[]) {

Sukejuru ske = new Sukejuru();

ske.setBounds(200,200,600,300);//大きさ&ウィンドウの位置
ske.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//クローズ
ske.setVisible(true);
}

Sukejuru() {
super("Myスケジュール");

JPanel p = new JPanel();
p.setBackground(Color.green);
add(p);

JButton b1 = new JButton("一月");
b1.addActionListener(this);
b1.setActionCommand("b1");
p.add(b1);

JButton b2 = new JButton("二月");
b2.addActionListener(this);
b2.setActionCommand("b2");
p.add(b2);

JButton b3 = new JButton("三月");
b3.addActionListener(this);
b3.setActionCommand("b3");
p.add(b3);
}

public void actionPerformed(ActionEvent e) {

JTable table = new JTable(5,5);
JScrollPane sp = new JScrollPane(table);
p.add(sp);
}
}

A 回答 (4件)

先人曰く 「プログラムは『思った通り』に動かない。

『書いた通り』に動く」

過去の質問でもありましたが、
・インスタンス変数/インスタンスメソッド
・static変数/staticメソッド
・ローカル変数
これらの違いが十分に理解できてないのではないでしょうか?

まずは
public class Sukejuru extends JFrame implements ActionListener {
JPanel p;

public class Sukejuru extends JFrame implements ActionListener {
JPanel mainPanel ;
にしてみてください。変えるのはこの1箇所だけです。他は変えないこと。
インスタンス変数pがインスタンス変数mainPanelに変わったので、インスタンス変数pを使っているところでは、変数pが未定義となり、コンパイルエラーになります。

が、変数pを使っているのにエラーにならない箇所があるはずです。
その変数pはSukejuruクラスのインスタンス変数ではない、ということです。
あなたは「インスタンス変数p」だと「思って」いるかもしれませんが、実際にはそのように「書かれて」いない、ということです。

インスタンス変数、インスタンスメソッドが理解できていないのなら、省略できる this. を省略しないのもよいでしょう。
どれがインスタンス変数/メソッドか意識することが大事です。

この回答への補足

本当に回答ありがとうございます。

私のためにこんなに、多く回答をしてい頂いて、感謝です。

私は、「java e本」というものでjava入門し、GUIjが作りたかったので、「javaコンポーネント完全制覇」というのを勉強中です。
しかし、読んでくうちに、この本が私と思っていた方向性を見失ったので下記のURLのサイトで勉強し始めました。サイトに、買い手内のか、私が読飛ばしたのどっちかですが、私はやはり未熟で【ローカル変数】や、【インスタンス変数】や、【static変数、staticメソッド】を聞いたことありません。そのため、補足を書かせていただきました。

下記URL  http://www.javadrive.jp/tutorial/

mainPanelにかえたところ、JButtonにはコンパイルエラー(シンボルが見つかりません)になりました。
何か自分が勉強したらいいもの、書籍、サイトがありましたらお教えよろしくお願いいたします。

補足日時:2012/10/08 22:45
    • good
    • 0

質問のプログラムは文法的に正しく,振る舞いが間違っています.



p.add(sp);

の行を次のように置き換えてコンパイル・実行すれば,おかしい部分を突き止める手がかりになるかと.

System.out.println("DEBUG: p = " + p);


調べてもnullになる理由が分からないという話であれば,改めてそう質問された方がよいと思います.「わけわからん英語や数字が現れます」という点に対しては,wormholeさんと同様によく考えてください,という方向の話になってしまいます.

この回答への補足

やはり、私は勉強不足なようで、さっぱりです。

なので、私がこれから勉強したらいいもの、書籍、サイトをお教えください。
お願いします。

補足日時:2012/10/08 22:48
    • good
    • 0

>私のプログラムがおかしくて、でも文法的にはあっている。


>つまりは何がおかしいのですか?

ヒントは与えてるんだからご自分で考えてください。

日本語だって英語だって文法的には間違ってないけど文章的や内容的にはおかしいとかあるじゃないですか。
例えば1~10の和を求めるプログラムを作ろうとしたとします。
めんどうなのでクラスとかmainとか書きませんけど。

int sum = 0;
sum *= 1;
sum *= 2;
sum *= 3;
sum *= 4;
sum *= 5;
sum *= 6;
sum *= 7;
sum *= 8;
sum *= 9;
sum *= 10;

コンパイルでエラーも警告も出ないと思います。
では上記は1~10の和を求めるプログラムとして正しいと思いますか?
    • good
    • 0

>ボタンを押すとコマンドプロンプトでわけわからん英語や数字が現れます(出力される)。



通常それは書かれたプログラムに何らかの問題があるからです。
コンパイルでエラーや警告がなかったからといって、それは構文的な話であってロジック的な部分についてはエラーや警告はしてくれません。
「わけわからん英語や数字」なんていってないで、それを理解する努力をしてください。

で、実行してボタンを押してみた結果。
43行目(actionPerformed()のp.add(sp))で何かの値がnull。
ヒントはここまで、ここから先は何がnullなのか、なぜそれはnullなのかよく考えてみてください。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Sukejuru.actionPerformed(Sukejuru.java:43)
(略)

この回答への補足

ロジック?!

私のプログラムがおかしくて、でも文法的にはあっている。
つまりは何がおかしいのですか?
自分はまだまだなため理解不能です。構文以外に注意しなければいけないこととは?回答者様のおっしゃることは、何のことをおっしゃているのですか?プログラムを書き直さなければならないということは、構文がおかしいということではないのですか??

補足日時:2012/10/07 15:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!