1

Risk のクローンを Java で書いていますが、コードに問題があります。新しいゲームを作成するときは、JTextField (プレーヤー名用) と JComboBox (プレーヤーの色用) を持つ JPanel を作成します。ユーザーが作成したいプレーヤーごとに 1 つのパネルです。このパネルのインスタンスは、2 番目の JComboBox に基づいて動的に作成されます。これにより、ユーザーは 3 から 8 までのプレイヤー数を選択できます。

私の問題は、プレーヤー作成パネルに入力されたデータからプレーヤー オブジェクトを作成するときに、各プレーヤー オブジェクトが最後に作成されたプレーヤー作成パネルからデータを取得することです。機能的な解決策がありますが、「適切な」解決策 () と思われるものが機能しない理由がわかりません。

これは私が今取り組んでいるコードです: 作成パネル クラス:

package risk;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class PlayerCreatePanel extends JPanel{

public static ImageIcon[] playerColors = {Resources.red,Resources.green,Resources.blue,Resources.cyan,Resources.magenta,Resources.yellow,Resources.orange,Resources.gray};

public JComboBox playerColor;

public JTextField playerName;

public PlayerCreatePanel(int index){

    this.setPreferredSize(new Dimension(360, 30));

    JLabel numberLabel = new JLabel ("Player " + index + ":  ");
    JLabel nameLabel = new JLabel("Name: ");
    JLabel colorLabel = new JLabel("  Color: ");

    playerName = new JTextField("");
    playerName.setColumns(13);

    playerColor = new JComboBox(playerColors);

    this.add(numberLabel);
    this.add(nameLabel);
    this.add(playerName);
    this.add(colorLabel);
    this.add(playerColor);
}
}

新しいゲーム クラスでは、プレーヤーを作成する部分:

package risk;

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JPanel;

public class NewGame {

private static PlayerCreatePanel [] panels = {  new PlayerCreatePanel(1), new PlayerCreatePanel(2), 
                                                new PlayerCreatePanel(3), null, null, null, null, null};

private static int playerCount = 3;

public static void createPlayers(){
    Resources.players = new Player[playerCount];
    switch(playerCount){
    case 8: Resources.players[7] = new Player (panels[7].playerName.getText(), Resources.colors[panels[7].playerColor.getSelectedIndex()], 8);
    case 7: Resources.players[6] = new Player (panels[6].playerName.getText(), Resources.colors[panels[6].playerColor.getSelectedIndex()], 7);
    case 6: Resources.players[5] = new Player (panels[5].playerName.getText(), Resources.colors[panels[5].playerColor.getSelectedIndex()], 6);
    case 5: Resources.players[4] = new Player (panels[4].playerName.getText(), Resources.colors[panels[4].playerColor.getSelectedIndex()], 5);
    case 4: Resources.players[3] = new Player (panels[3].playerName.getText(), Resources.colors[panels[3].playerColor.getSelectedIndex()], 4);
    case 3: Resources.players[2] = new Player (panels[2].playerName.getText(), Resources.colors[panels[2].playerColor.getSelectedIndex()], 3);
            Resources.players[1] = new Player (panels[1].playerName.getText(), Resources.colors[panels[1].playerColor.getSelectedIndex()], 2);
            Resources.players[0] = new Player (panels[0].playerName.getText(), Resources.colors[panels[0].playerColor.getSelectedIndex()], 1); break;
    default: break;     
    }
}
}

さて、私が学んだことは、これを行う適切な方法は、JTextField と JComboBox を非公開にし、次のようにアクセサーを記述することです。

private JComboBox playerColor;
private JTextField playerName;

//...same method as above

public static String getName(){
    return playerName.getText();
}

public static int getColorIndex(){
    return playerColor.getSelectedIndex();
}

新しいゲーム メソッドの作成行を次のように変更します。

Resources.players [0] = new Player (panels[0].getName(), panels[0].getColorIndex(), 1);
4

0 に答える 0