Javaでトランプゲームを作成しています。すべてのルールなどを含むゲームロジック全体を既にプログラムしたことから始めて、私はそのモデルの上にGUIを実装し始めました。私のJavaとSwingの知識は基本的には私にとっては裸であるからです。Java Swing:Running GUI別のClassメソッドからのメソッドの更新
私は5つのクラスを持っていますが、私が話しているのは「メイン」クラスまたはゲームクラスと「GUI」クラスだけです。まず、手を構築するために、私が作成したオブジェクトタイプ<カードのArrayListsを使用します。このゲームは、Play()と(現時点では)コンソールを介してHuman Players Handを表示し、ArrayList内の整数選択をして配置するように求める方法で再生します。私はmain(String [] args)クラスをMainクラスに持ち、クラスGUIを呼び出して私が使用するゲームボードをセットアップします。
public static void main(String[] args)
{
Deck deck = new Deck();
ai = new AI;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GUI gui = new GUI();
gui.setVisible(true);
}
})
は、理想的には私はゲームが両方のボードを更新し、カードの人間のプレイヤーの選択を返すためにGUIクラスからプレイ()メソッドと呼び出し方法を使用してプレイしたいと思います。ボードを設定するときに、現時点で私ができる最善のは、私がクリックされたときにパネルをクリアし、バックカードのJLabelを再描画され、
public void UpdateHand()
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
inPlay = main.inPlay;
UpdateInPlay(inPlay, InPlayDisplay);
HumanHand = main.humanplayer;
HumanHandDisplay.removeAll();
を実行します
Button go = new Button("Update Hand");
ButtonDisplay.add(go);
go.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Thread queryThread = new Thread() {
public void run() {
UpdateHand();
}
};
queryThread.start();
}
});
経由ボタンを実装していますに。
私の質問は、GUIクラスでPlay()メソッドのメソッドを呼び出すにはどうすればいいですか? Play()メソッドからUpdateHand()を実行しようとすると、ちょうど
gui.UpdateHand();
Gui.UpdateHand()行でNullPointerExceptionを返しますが、ArrayListなどのように伝えると、UpdateHand()メソッド内の変数はコンソールに出力されます。私が言ったように、ボードを更新するgui上のボタンを持つ代わりに、私は自分のPlay()メソッドを呼び出して、その順番の回りをループするようにUpdateMethodを呼び出すだけで、プレーヤーがカードを選択する必要があるとき私が今使っているコンソールスキャナを使うには、テキストフィールドとボタンをボードに追加してユーザが選択したものをタイプするメソッドを実行します。このメソッドは次にPlay()メソッドに戻され、ゲームの計算を続けます。
私が間違っていることや、ここで指定したものを達成する方法について、誰でも光を当てることができますか?
EDIT:
GUI
public class GUI extends JFrame
{
public Main main;
private ArrayList<Card> AIHand;
public GUI() {
pane = this.getContentPane();
pane.setLayout(new GridLayout(6,1,2,2));
AIBackDisplay = new JPanel();
//just more of the same for other panels here
pane.setBackground(Color.GREEN);
setTitle("Last Man Standing");
pane.add(AIBackDisplay);
pane.add(AIHandDisplay);
pane.add(InPlayDisplay);
pane.add(HumanHandDisplay);
pane.add(HumanBackDisplay);
pane.add(HumanFacedownDisplay);
pane.add(ButtonDisplay);
setSize(800, 700);
setLocationRelativeTo(pane);
setDefaultCloseOperation(EXIT_ON_CLOSE);
UpdateFacedown(AIFacedown, AIBackDisplay); //these are methods called for original display
UpdateFacedown(HumanFacedown, HumanBackDisplay);
を要求したとして、2クラスのための私のコードの
より、私はボタンを経由してと呼ばれ、この
for (int i = 0; i < (HumanHand.size()); i++)
{
Card card = HumanHand.get(i);
BufferedImage cardImage = null;
try {
cardImage = ImageIO.read(new File("card/" + card + ".jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JLabel picLabel = new JLabel(new ImageIcon(cardImage));
HumanHandDisplay.add(picLabel);
}
HumanHandDisplay.updateUI();
をしているupdateHand()メソッドを持っています私のメインクラスは
public class Main {
static AI ai;
public static GUI gui;
です
たGUIは、そうでない場合、私はそれが私は、GUIを実行してみましょうdoes notのGUIが静的である場合でも、
Scanner sc = new Scanner (System.in);
choice = sc.nextInt(); //what i'm using now
//choice = gui.GUIReturn(); //what i'd like to use
を使用してそれを呼び出すことができませんでした、静的でなければなりませんでした。GUIReturn()何らかの理由で、それは静的でなければならないと言います
[sscce](http://sscce.org/)を構築すると便利なことがあります。 – trashgod
Java命名規則を学び、それらに固執してください。 – kleopatra