私は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");
}
}
}
}
+1 for sscce http://sscce.org/画像は無関係ですが、 – trashgod
再フォーマットされたコード。間違っている場合は元に戻してください。 – trashgod