2011-02-22 33 views
1

我正在學習Java開發和家庭作業任務我已被指示使用Swing框架編寫基本應用程序。該設置非常簡單:一個應用程序從卡片組(Arraylist)中選擇兩張卡片(字符串),讓用戶猜測第二張卡片是高於還是低於第一張。Java Swing練習 - 無法訪問變量,不知道爲什麼

小菜一碟,對不對?所以我想,直到我偶然發現一個問題:我已經將一個動作鏈接到一個按鈕,並且該動作確實被執行,但我似乎無法訪問我在處理動作時在應用程序中啓動的變量。看一下「Gok hoger」這個動作,它會爲「kaart1」返回一個空值。然而,當我在我的程序構造函數中回顯字符串「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爲sscce http://sscce.org/,雖然圖像是不相關的。 – trashgod

+0

重新格式化的代碼;如果不正確請回復。 – trashgod

回答

4

您有兩個名爲kaart1的變量。一個是Programma構造函數的局部。在「Actie」中訪問的是實例變量。

您可能不想在構造函數中聲明第二個變量,而是初始化實例變量。替換「String kaart1 = new String(trekKaart(kaartboek));」 「kaart1 = new String(trekKaart(kaartboek));」

+0

令人驚訝的是,有些事情會變得如此清晰。我正在尋找一個更復雜的原因。非常感謝! :) –

-2

變量kaart1未在類Actie中聲明。那就是爲什麼它是空的。你的代碼很難爲我讀(部分你的語言部分設計),所以我不完全知道你在做什麼。

+1

-1您應該將其置於評論之下。 –

1

你得到空,因爲您使用的是這裏的局部變量:

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

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

在你宣佈兩個新的對象該地圖的構造代替。內部類嘗試訪問未分配,因此「空」老該地圖變量

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

正如其他人指出,問題圍繞Hiding Fields。此外,考慮到編程接口:

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

trekKaart(),不要實例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構造函數調用,所以他們應該是私有的。

相關問題