2011-02-22 5 views
1

私はJava開発と宿題の割り当てを学習しています。私は、Swingフレームワークを使って基本アプリケーションをコーディングするように指示されています。セットアップはかなりシンプルです:カードデッキ(Arraylist)から2枚のカード(ストリング)を選び、2枚目のカードが最初のカードよりも高いか低いかをユーザーが推測してみましょう。Java Swingエクササイズ - 変数にアクセスできない、理由を知らない

ケーキのピース、右?だから、私は問題に遭遇するまで、私は考えました:私はボタンにアクションをリンクし、アクションは実行されますが、私は私のアプリケーションでアクションを処理中に開始した変数にアクセスできないようです。 "Gok hoger"というアクションを見て、 "kaart1"のヌル値を返します。それでも、私のプログラムのコンストラクタでString "kaart1"をエコーすると、うまくいっています。私はこれの原因については断っているので、ここで素晴らしいアイデアのいくつかが私のコードがなぜこのように動作するのかを説明することができれば幸いです。

if(e.getActionCommand().equals("Gok hoger")){ 
    System.out.println(kaart1); // <------- Why does this return null? 
} 

はい、これは宿題です。私はそのような場合に備えてそのようにタグ付けしました。

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.util.*; 
import java.awt.Dimension; 

public class Programma extends JFrame { 

    ArrayList<String> kaartboek = new ArrayList<String>(); 
    boolean gewonnen = false; 
    int kaart1waarde; 
    int kaart2waarde; 
    String kaart1; 
    String kaart2; 

    public Programma(){ 
     super("Hoger/lager"); 

     vulKaartboek(kaartboek); 
     String kaart1 = new String(trekKaart(kaartboek)); 
     String kaart2 = new String(trekKaart(kaartboek)); 

     JButton hogerButton = new JButton("Hoger"); 
     JButton lagerButton = new JButton("Lager"); 
     hogerButton.setAction(new Actie("Gok hoger")); 
     lagerButton.setAction(new Actie("Gok lager")); 

     JLabel kaart1label = new JLabel(new ImageIcon(
      "/Users/David/Dropbox/School/eclipse/2011/VGO_Opdracht1/src/kaartboek/" 
      + kaart1 +".png")); 
     JLabel kaart2label = new JLabel(new ImageIcon(
      "/Users/David/Dropbox/School/eclipse/2011/VGO_Opdracht1/src/kaartboek/" 
      + "back" + ".png")); 

     Container c = getContentPane(); 
     c.setLayout(new GridLayout(2,2)); 
     c.add(kaart1label); 
     c.add(kaart2label); 
     c.add(hogerButton); 
     c.add(lagerButton); 

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.pack(); 
     this.setVisible(true); 
    } 

    public static void main (String args[]){ 
     JFrame frame1 = new Programma(); 
    } 

    public String getKaartSuit(String kaart){ 
     String kaart1suit = kaart.substring(0, 1); 
     if(kaart1suit.equals("c")){kaart1suit = "Klaveren";} 
     if(kaart1suit.equals("d")){kaart1suit = "Ruiten";} 
     if(kaart1suit.equals("h")){kaart1suit = "Harten";} 
     if(kaart1suit.equals("s")){kaart1suit = "Schoppen";} 
     return kaart1suit; 
    } 

    public String getKaartBeeld(String kaart){ 
     int kaartwaarde = Integer.parseInt(kaart.substring(1, kaart.length())); 
     String kaartbeeld = ""; 
     switch(kaartwaarde){ 
      case 2: kaartbeeld = "Twee"; break; 
      case 3: kaartbeeld = "Drie"; break; 
      case 4: kaartbeeld = "Vier"; break; 
      case 5: kaartbeeld = "Vijf"; break; 
      case 6: kaartbeeld = "Zes"; break; 
      case 7: kaartbeeld = "Zeven"; break; 
      case 8: kaartbeeld = "Acht"; break; 
      case 9: kaartbeeld = "Negen"; break; 
      case 10: kaartbeeld = "Tien"; break; 
      case 11: kaartbeeld = "Boer"; break; 
      case 12: kaartbeeld = "Dame"; break; 
      case 13: kaartbeeld = "Heer"; break; 
      case 14: kaartbeeld = "Aas"; break; 
     } 
     return kaartbeeld; 
    } 

    public String getKaartNaam(String kaart){ 
     String kaartnaam = getKaartSuit(kaart) + " " + getKaartBeeld(kaart); 
     return kaartnaam; 
    } 

    public String trekKaart(ArrayList<String> kaartboek){ 
     Random random = new Random(); 
     int willekeurig = random.nextInt(kaartboek.size()); 

     String kaart = kaartboek.get(willekeurig); 
     kaartboek.remove(willekeurig); 

     return kaart; 
    } 

    public void vulKaartboek(ArrayList kaartboek){ 
     for(int i = 2; i < 14; i++){ 
      kaartboek.add("c" + i); // Clubs 
      kaartboek.add("d" + i); // Diamonds 
      kaartboek.add("h" + i); // Hearts 
      kaartboek.add("s" + i); // Spades 
     } 
    } 

    public int getKaartWaarde(String kaart){ 
     int kaartwaarde = Integer.parseInt(kaart.substring(1, kaart.length())); 
     return kaartwaarde; 
    } 

    class Actie extends AbstractAction { // Inner klasse 
     public Actie(String s){ 
      super(s); 
     } 
     public void actionPerformed(ActionEvent e) { 
      if(e.getActionCommand().equals("Gok hoger")){ 
       System.out.println(kaart1); // <------- Why does this return null? 

       } 
      if(e.getActionCommand().equals("Gok lager")){ 
       System.out.println("Test"); 
      } 
     } 
    } 
} 
+0

+1 for sscce http://sscce.org/画像は無関係ですが、 – trashgod

+0

再フォーマットされたコード。間違っている場合は元に戻してください。 – trashgod

答えて

4

kaart1という2つの変数があります。 1つはProgrammaコンストラクターにとってローカルです。 "Actie"でアクセスされるのはインスタンス変数です。

おそらく、2番目の変数をコンストラクタで宣言しないで、代わりにインスタンス変数を初期化することを意味します。置換 "文字列kaart1 =新しい文字列(trekKaart(kaartboek));" "kaart1 = new String(trekKaart(kaartboek));"と入力します。

+0

いくつかのことがどのくらい明確になるかは驚くべきことです。私ははるかに複雑な原因を探していました。どうもありがとう! :) –

-2

変数kaart1は、クラスActieで宣言されていません。それはなぜnullです。あなたのコードは私のために読むのが難しいです(部分的にあなたの言語の一部をデザインしています)ので、あなたがしようとしていることを正確には分かりません。

+1

-1これはコメントの下に置いてください。 –

1

あなたはここでローカル変数を使用しているので、あなたはnullを取得:

String kaart1 = new String(trekKaart(kaartboek)); 

は、2つの新しいkaartオブジェクトを宣言しているコンストラクタで

this.kaart1 = new String(trekKaart(kaartboek)); 
0

と交換してください。内部クラスは、他の人が指摘したように、問題はHiding Fieldsの周りを公転する

String kaart1; 
String kaart2; 

public Programma(){ 
    super("Hoger/lager"); 

    vulKaartboek(kaartboek); 
    String kaart1 = new String(trekKaart(kaartboek)); // You shoud initialize it as this.kaart1 
    String kaart2 = new String(trekKaart(kaartboek)); // You shoud initialize it as this.kaart2 

} 
1

ので、「ヌル」に割り当てられていない古いkaart変数にアクセスしようとしています。また、インターフェイスにプログラミングを検討:trekKaart()

List<String> kaartboek = new ArrayList<String>(); 

、繰り返しRandom()をインスタンス化しないでください。代わりに、一度デッキをシャッフル:

Collections.shuffle(kaartboek); 

次にあなたがtrekKaart()単純で簡単にランダムなカードを取得することができます。

kaart1 = trekKaart(kaartboek, 1); 
kaart2 = trekKaart(kaartboek, 2); 

private String trekKaart(List<String> kaartboek, int index) { 
    return kaartboek.get(index); 
} 

は最後に、trekKaart()vulKaartboek()Programmaコンストラクタから呼び出されるので、彼らはプライベートでなければなりません。

関連する問題