• ベストアンサー

javax.swing

を使ったプログラムがコンパイルはとおるのに実効時エラーになります。 java.lang.NullPointerException をだします。 なにがわるいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

ソースを調べてもしばらくわかりませんでした。 やっとわかりました。 ・28行目でJRadioButtonの状態を変化させている。 ・状態を変化させたことでリスナのitemStateChanged()が働く。 ・39行目でcanvasを使っているが、この時点においては まだcanvasオブジェクトは生成されていない。 このためエラーが出ます。 なお、AWTのGUI部品とSwingのGUI部品を混在させて使うと 不具合が出るため、Canvasは使わない方がいいでしょう。 「でもSwingにJCanvasが存在しない」と悩む人が多いのですが、 CanvasのかわりとしてはJPanelを使います。 コンストラクタ最初の方で、色表示用のJPanelを生成してみてください。

keyguy
質問者

お礼

ありがとうございます。 キャンバス作成行を最初のほうに移動したら動きました。 これはサンプルなのですが動かして確かめてから出して欲しいものですね。

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

Swing固有の問題ではないと思います。 java.lang.NullPointerExceptionは、 オブジェクトを適切に生成していないとき出るエラーです。 つまり、どこかでオブジェクトを作り忘れているのです。 Class a; // 「= new Class()」を忘れている。 a.method(); //オブジェクトが作られてないのにメソッドを使った。 のような感じで、簡単にエラーになります。 Javaで、もっとも頻繁に入れてしまうバグです。 エラーメッセージに 「どのクラスの何行目でエラーが起きた」 という情報があると思いますから、 それを見て、オブジェクトの作り忘れを探してください。

keyguy
質問者

補足

ありがとうございす。 プログラムは以下のようになっています。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JRadioButtonEvent extends JPanel { public Canvas canvas; public JRadioButtonEvent() { super(); ButtonGroup group = new ButtonGroup(); ChoiceAdapter adapter = new ChoiceAdapter(); Color[] colors = { Color.black, Color.red, Color.orange, Color.yellow, Color.green, Color.cyan, Color.blue, Color.magenta, Color.white }; JRadioButton[] radios = new JRadioButton[colors.length]; for( int i=0; i<colors.length; i++ ) { radios[i] = new JRadioButton(); radios[i].setBackground( colors[i] ); group.add( radios[i] ); add( radios[i] ); radios[i].addItemListener( adapter ); } radios[0].setForeground( Color.white ); group.setSelected( radios[0].getModel(), true ); canvas = new Canvas(); canvas.setBackground( Color.black ); canvas.setSize( 128, 128 ); add( canvas ); } class ChoiceAdapter implements ItemListener { public void itemStateChanged( ItemEvent evt ) { JRadioButton rb = (JRadioButton)(evt.getItemSelectable()); canvas.setBackground( rb.getBackground() ); } } public static void main( String argv[] ) { JFrame frame = new JFrame( "JRadioButton Event Test" ); JRadioButtonEvent panel = new JRadioButtonEvent(); frame.getContentPane().add( panel ); frame.pack(); frame.setVisible( true ); } }

関連するQ&A