• ベストアンサー

カード(ボタン)をクリックで選ぶ→決定

3枚のカード(Button)から一枚をクリックで選択して 決定ボタンであたりかはずれかを表示するプログラムを作りたいのですが クリックされたカードの情報を決定ボタンで結果を表示するresult関数に受け渡すときにエラーがでます。 適切な書き方をどなたか教えてください。 なおGameMouseAdapterクラスとGameWindowクラスは別々のjavaファイルになっています。 -----GameMouseAdapter.java-------------------------- import java.awt.event.*; public class GameMouseAdapter extends MouseAdapter{ private GameWindow gw; private int select; GameMouseAdapter(GameWindow gw){ this.gw=gw; } public void mouseClicked(MouseEvent e){ Object cmd = e.getSource(); if(cmd==gw.card[0]) select=0; if(cmd==gw.card[1]) select=1; if(cmd==gw.card[2]) select=2; if(cmd==kettei) gw.result(select); } }

  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
回答No.4

>if(cmd==gw.kettei) gw.result(select);の行でNullPointer Exceptionエラーがでます。 この行でNullPointer Exceptionが出る原因を考えてみましょう。cmdがnullでも、nullとあるオブジェクト(gw.kettei)を比較するだけなのでExceptionは発生しません。gw.ketteiがnullでも同様です。selectは最初は0で初期化されています。gw.resultは関数だからnullとかいう概念は存在しませんね? というわけで、本当にここの行でNullPointerならばgwがnullなのでしょう。しかし、その上の行でgw.card[0]という行があるので、本当にNullPointerならば上で出てくるはずです。というわけで、私には現時点でここでExceptionが出る理由はわかりません。gw.resultの内部と言うのなら話はわかりますが。 何はともあれ、GameWindowのほうに原因があるはずなので、GameWindowの中身がわからないことにはだれも答えられないと思いますよ。これだけでわかるのはgwやselectをprivateにしているようにcardやketteiもprivateにしたほうがいいのではないですか?というアドバイスくらいです。

blackey
質問者

お礼

すみません。色々試したところGameWindowクラスにやはり問題があったようで、なおしたら動作しました。ありがとうございます。

その他の回答 (3)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

 こんにちは。  「変数selectが初期化されていない可能性があります」エラーじゃないでしょうか?  カードのボタンを押さずにいきなり決定ボタンを押すと変数selectが一度も値を設定しないまま、resultメソッドに渡されてしまいますよね。  コンストラクタで、初期値を設定しておいたほうがよいと思います。  最初から選択状態のディフォルトのカードがあるというのなら、その値を。  無選択という状態を考慮するなら、-1でも入れておいて、resultメソッド内で無選択の場合の処理も考えておけば、よいと思います。

blackey
質問者

お礼

アドバイスありがとうございます。 初期値-1を設定してresultメソッドにその場合の処理を追加してみましたが、それでも実行時にエラーが起きます。 選択しても選択しなくても決定ボタンを押したところでコンソールにエラーがでます。

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

とりあえず、コンパイルエラーですか?実行時エラーですか?

blackey
質問者

補足

書き忘れていました。 コンパイルでエラーはなく、 実行したとき1枚カードを選んで決定ボタンを押すと if(cmd==gw.kettei) gw.result(select); の行でNullPointer Exceptionエラーがでます。

  • meenie
  • ベストアンサー率44% (40/90)
回答No.1

情報が少なくてはっきりとは言えませんが(私の力不足かな)、エラーになる原因は変数ketteiが見つからないためです。 GameMouseAdapterクラスでは宣言も定義もされていませんし、 別のクラスのstaticオブジェクトならクラス名の修飾が必要です。 例えば gw.kettei みたいに、何オブジェクト(クラス)がketteiを持っているのかを指定してあげましょう。

blackey
質問者

お礼

すみません。 if(cmd==gw.kettei){ の間違いでした。 補足ありがとうございます。

関連するQ&A

  • ボタンクリック後パネルを再描画repaintしたい

    ボタンをクリック後にstaticで保持していた値にプラス1して その値をパネルに再描画したいと思っています。 下記のプログラムだとボタンをクリックすると (<1<2<3<4)となって画像と数字が増えてしまいます 行いたいのは数字の部分だけが再描画されて カウントされて<3と表示されるだけになってもらいたい クラス1つ目 import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Sample extends JFrame{ static int value=1; JPanel work = new JPanel(); public static void main(String[] args) { Sample frame = new Sample(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 200, 200, 100); frame.add(frame.createPanel(), BorderLayout.LINE_END); frame.setVisible(true); } public JPanel createPanel() { ImageIcon icon = new ImageIcon("./img/left.gif"); JLabel label = new JLabel(); Cursor c = new Cursor(Cursor.HAND_CURSOR); label.setCursor(c); label.setIcon(icon); JLabel strLabel = new JLabel(); String str = Integer.toString(value); strLabel.setText(str); work.add(label); work.add(strLabel); label.addMouseListener(new myListener()); return work; } class myListener extends MouseAdapter{ public void mouseClicked(MouseEvent e){ System.out.print(Sample.value++); createPanel().repaint(); setVisible(true); } } } クラス2つ目 import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MouseAdapter implements MouseListener{ public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} }

    • ベストアンサー
    • Java
  • 「ScrollPane」のイベントの取得方法は?(AWT)

    タイトルのままなのですが、「ScrollPane」のイベント取得方法が知りたいのです。 例えばマウスのイベントを取得する時は下記のようにしますよね。 ************************************************* panel1.addMouseListener(new panel1_MouseAdapter(this)); ************************************************* class panel1_MouseAdapter extends java.awt.event.MouseAdapter { Panel_main adaptee; panel1_MouseAdapter(Panel_main adaptee) { this.adaptee = adaptee; } public void mouseClicked(MouseEvent e) { adaptee.panel1_mouseClicked(e); } } ************************************************* void panel1_mouseClicked(MouseEvent e){ //ここに処理を書く } ************************************************* 「ScrollPane」のスクロールされたとか、↓↑がクリックされたなどスクロール特有のイベントを取得したいのです。

    • ベストアンサー
    • Java
  • 配列で作ったオブジェクトのイベントを取得するには?

    下記のクラス内で"ary"という10枚のパネルのオブジェクトを配列で作成しました。その"ary"パネルがクリックされた時のイベントを書きたいのですが、私の書いたロジックではイベントを取得できませんでした。 なにか良い方法がありませんでしょうか? public class Main_Panel extends Panel{ int y = 0; Panel ary[] = new Panel[10];   //CONSTRUCT public MainPanel() { for(int i = 0 ; i < 10; i++ ){ ary[i] = new Panel() this.add(ary[i], null); ary[i].setBounds(new Rectangle(0, y, 5, 5)); intYPos = intYPos + 10; ary[i].addMouseListener(new ary_MouseAdapter(this)); } } //パネル(ary)クリックイベント void ary_mouseClicked(MouseEvent e){ } } class ary_MouseAdapter extends java.awt.event.MouseAdapter { Main_Panel adaptee; ary_MouseAdapter(Main_Panel adaptee) { this.adaptee = adaptee; } public void mouseClicked(MouseEvent e) { adaptee.ary_mouseClicked(e, num); } }

    • ベストアンサー
    • Java
  • JTreeの+-ボタンについて

    JTreeを使ってウィンドウズエクスプローラーのようなものを作りたいと思っています。 JTreeはノードのテキスト内をクリックしないと選択されませんが、エクスプローラーのツリーはそのノードと同じ高さであればどこをクリックしても選択になります。 それを再現しようと以下のコードを書いてみました。 しかしこれだとツリーのノードの展開、非展開を切り替える+-のボタン?の動作が変になります。 +-ボタン領域をクリックすると展開、非展開切り替えの後で改めてノードを選択、展開になります。 +-ボタン領域をクリックした場合はノード選択の処理に入らないようにすれば良いと思うのですがその+-ボタン領域の計算方法や取得方法が分かりません。 あるいはもっと良い方法を知っている方、是非教えてください。よろしくお願いします。 jTree.addMouseListener(new MouseAdapter() {  public void mouseClicked(MouseEvent e) {   int d = jTree.getRowBounds(0).getBounds().y;   int row = jTree.getRowCount();   int height = jTree.getRowHeight();   int mouse = e.getY() + d;   int selectrow = 0;   if (height > 0) {     selectrow = (int) (mouse / height);   } else {     selectrow = jTree.getRowForLocation(e.getX(), e.getY());   }   if (selectrow < row) {     jTree.setSelectionRow(selectrow);   }   if (SwingUtilities.isRightMouseButton(e)) {     jPopupMenu.show(e.getComponent(), e.getX(), e.getY());   }  } });

    • ベストアンサー
    • Java
  • 画像イメージをボタンにしたときのクリック時

    下記のスクリプトにおいて、画像イメージ全体をひとつのボタンと扱い、その中の長方形の部分をクリックした際に、result.phpにジャンプするアンカーを表示しようとしているのですが、画像の長方形部分をクリックしても、アンカーが表示されません。どこが間違っているのか、おしえていただきたいです。 [reserve.php] 前略 <?php if($_POST['cmd_x']>$start && $_POST['cmd_x']<$end && $_POST['cmd_y']>120 && $_POST['cmd_y']<160){ // 予約時間表示バーの長方形の内部をマウスクリックした場合 echo '<a href="result.php">予約結果</a>'; } 中略 echo '<form name="form2" method="post" action="reserve.php">'; echo '<input type="image" name="cmd" src="show_schedule.php">'; echo '</form>'; ?>

    • ベストアンサー
    • PHP
  • 電卓の数字0~9までのボタンをクリックした時

    VB.NETでの質問です。 電卓の数字0~9までのボタンをクリックした時 ラベルに表示されません。 作成したコードは Private Sub cmd_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles cmd1.Click, cmd2.Click, cmd3.Click, _ cmd4.Click,cmd5.Click, cmd6.Click, _ cmd.Click, cmd8.Click,cmd9.Click, _ cmd0.Click Dim cmd As Button Dim No As String cmd = CType(sender, Button) 'イベント発生元のボタン情報を取得 Select Case cmd.Name 'ボタン名を参照 Case "cmd1" : No = "1" Case "cmd2" : No = "2" Case "cmd3" : No = "3" Case "cmd4" : No = "4" Case "cmd5" : No = "5" Case "cmd6" : No = "6" Case "cmd7" : No = "7" Case "cmd8" : No = "8" Case "cmd9" : No = "9" Case "cmd0" : No = "0" End Select End Sub エラーは cmd.clickで指定されているメゾットで表示できません。 cmdは宣言されていません。 ということでした。 どうすれば、電卓の数字をクリックしたときに、 ラベルに表示できますか? よろしければ添削お願いいたします。 助言でも結構ですので、申し訳ありませんが よろしくお願いします。

  • VB2008EEのラジオボタンのチェック無し

    VB2008EEのラジオボタンのチェック無し     4つにチェックを入れてしまうと、全ての変数に値が入ってしまい、ボタンクリック時にチェックが 入っていないのを含めて、batファイル4つとも実行されてしまいます。 チェックボックスだと、下記でチェックされていないもの値を変えられます。 If CheckBox1.CheckState = CheckState.Unchecked Then   aaa = "9" End If ラジオボタンでチェックされていない所の変数を変える事は出来るでしょうか? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If (aaa = "1") Then Shell("cmd /c xxx.bat", AppWinStyle.NormalFocus, True) End If If (bbb = "2") Then Shell("cmd /c yyy.bat", AppWinStyle.NormalFocus, True) End If If (ccc = "3") Then Shell("cmd /c zzz.bat", AppWinStyle.NormalFocus, True) End If If (ddd = "4") Then Shell("cmd /c www.bat", AppWinStyle.NormalFocus, True) End If End Sub Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged aaa = "1" End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged bbb = "2" End Sub Private Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged ccc = "3" End Sub Private Sub RadioButton4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton4.CheckedChanged ddd = "4" End Sub

  • VB2008EEのラジオボタンのチェック無し

    VB2008EEのラジオボタンのチェック無し     4つにチェックを入れてしまうと、全ての変数に値が入ってしまい、ボタンクリック時にチェックが 入っていないのを含めて、batファイル4つとも実行されてしまいます。 チェックボックスでも同じような記述をしていまして、下記の記述でチェックされていないものの値を変えられます。 If CheckBox1.CheckState = CheckState.Unchecked Then   aaa = "9" End If Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If (aaa = "1") Then Shell("cmd /c xxx.bat", AppWinStyle.NormalFocus, True) End If If (bbb = "2") Then Shell("cmd /c yyy.bat", AppWinStyle.NormalFocus, True) End If If (ccc = "3") Then Shell("cmd /c zzz.bat", AppWinStyle.NormalFocus, True) End If If (ddd = "4") Then Shell("cmd /c www.bat", AppWinStyle.NormalFocus, True) End If End Sub Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged aaa = "1" End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged bbb = "2" End Sub Private Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged ccc = "3" End Sub Private Sub RadioButton4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton4.CheckedChanged ddd = "4" End Sub レベル低いといきなりラスボスは倒せないので、目先のミッションクリアが目的です。 応用は後々学んで行きます。 「ラジオボタンでチェックされていない所の変数を変える事は出来るでしょうか?」  

  • VB2008EEのラジオボタンのチェック無し

    VB2008EEのラジオボタンのチェック無し     4つにチェックを入れてしまうと、全ての変数に値が入ってしまい、ボタンクリック時にチェックが 入っていないのを含めて、batファイル4つとも実行されてしまいます。 チェックボックスでも同じような記述をしていまして、下記の記述でチェックされていないものの値を変えられます。 If CheckBox1.CheckState = CheckState.Unchecked Then   aaa = "9" End If Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If (aaa = "1") Then Shell("cmd /c xxx.bat", AppWinStyle.NormalFocus, True) End If If (bbb = "2") Then Shell("cmd /c yyy.bat", AppWinStyle.NormalFocus, True) End If If (ccc = "3") Then Shell("cmd /c zzz.bat", AppWinStyle.NormalFocus, True) End If If (ddd = "4") Then Shell("cmd /c www.bat", AppWinStyle.NormalFocus, True) End If End Sub Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged aaa = "1" End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged bbb = "2" End Sub Private Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged ccc = "3" End Sub Private Sub RadioButton4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton4.CheckedChanged ddd = "4" End Sub レベル低いといきなりラスボスは倒せないので、目先のミッションクリアが目的です。 応用は後々学んで行きます。 「ラジオボタンでチェックされていない所の変数を変える事は出来るでしょうか?」

  • Javaのソースについて質問です・・・

    Javaのソースについて質問です・・・ Javaで「JCheckbox」クラスを使い、選ばれたら、『「」が選ばれました。』とテキストが表示され、 チェックが解除されたら、『選ぶのをやめました。』と表示されるようにしたいのですが、 そのソースについて質問です。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class sample11 extends JApplet {   private JLabel lb;   private JPanel pn;   private JCheckBox ch1,ch2,tmp;   public void init()   {     //コンポーネントの作成     lb=new JLabel("選んでください");     pn=new JPanel();     ch1=new JCheckBox("A");     ch2=new JCheckBox("B");     //コンテナへの追加     pn.add(ch1);     pn.add(ch2);     add(lb,BorderLayout.NORTH);     add(pn,BorderLayout.SOUTH);     //リスナの登録     ch1.addItemListener(new SampleItemListener());     ch2.addItemListener(new SampleItemListener());   }   //リスナクラス   class SampleItemListener implements ItemListener   {      public void itemStateChanged(ItemEvent e)      {        if(e.getStateChange()==ItemEvent.SELECTED){          tmp=(JCheckbox) e.getSource();          lb.setText(tmp.getText()+"を選びました。");        } else if(e.getStateChange()==ItemEvent.DESELECTED) {          tmp=(JCheckbox) e.getSource();          lb.setText(tmp.getText()+"をやめました。");        }      }   } } ・なぜ、チェックボックスが表示されるわけでもないのにリスナクラス内で、  オブジェクトを作成しなければならないのか? ・(JCheckbox)とはJCheckboxのオブジェクトを作成するという記述を省略したものなのか? ・なぜ、「tmp」を介して「lb」にテキストをセットしなければならないのか? 上の三つの点が分りません。 説明お願いしますorz .

    • ベストアンサー
    • Java