0

そこで、JFrames を使用して基本的な RPG ユーザー ID 選択メニューを作成しようとしています。ラジオ ボタンを使用して ID オプションを表示することにしました。ユーザーが ID を選択したら、JOptionPane を使用してそれを元に戻します。これはすべて MyClass クラス内で行われます。ユーザーが ID を選択すると、.txt ファイルから読み取り、ユーザーが行った選択をチェックします。これは、各ユーザー ID が .txt ファイルに統計情報も含まれているキャラクターに関連付けられているためです。.txt ファイルの複数の行を分割し、さまざまな特性をすべて個別の文字列として保存することができました。私の問題は、JFrames を使用して前述の特性を表示する MyClass の外に別のクラスを作成したいので、.txt ファイルの分割が Try-Catch 内で行われたため、変数を渡すのに問題があることです。読んだ、これらの変数は、Try-Catch のスコープ内にのみ含まれています。これは、私が言及した最初のクラスのメソッドがどのように見えるかです:

public void checkID()
{

    StringBuilder allInfo=null; //Used to store all the Info
    String line=null; //Used as condition for loop & to generate the String Builder
    String strAll2=null;
    String[] sa=null;
    String[] sb=null;
    String[] sd=null;
    String[] se=null;
    BufferedReader br=null;
     //User Id as a string

    try {



        br = new BufferedReader(new FileReader("charList.txt"));
        allInfo= new StringBuilder();

        while ((line=br.readLine()) != null)
        { 
            allInfo.append(line + "\n");
        }

        strAll2=allInfo.toString(); //all the info of charList.txt as one StringBuilder
        sa=strAll2.split("\n"); //all the info of charList.txt as a String
        sb=sa[0].split("\t"); //all the info of the first line of the file as individual strings
        sd=sa[1].split("\t"); //all the info of the second line of the file as individual strings
        se=sa[2].split("\t"); //all the info of the third line of the file as individual strings


        if (firstIdButton.isSelected())
        {
            strId=sb[0];
        }
        else
        {
            if (secondIdButton.isSelected())
        {
            strId=sd[0];
        }
            else
            {
                if (thirdIdButton.isSelected())
                {
                    strId=se[0];
                }
            }
        }

        ID = Integer.parseInt(strId);
    }//end of try 
    catch (IOException e) {
        e.printStackTrace();        

    }//end of catch



    setVisible(false); //Hides Window



}//end of check id method

ID と strId の両方をメイン クラスでそれぞれ public int と String として宣言しました。ここで、MyClass の外にある別のクラスで ID を呼び出すという行に沿って何かを実行しようとしています。表示するキャラクターを確認します。問題は、コンストラクターをインスタンス化して変数にアクセスしようとすると、try-catch のスコープではブロック内で取得した値を渡すことができないため、0 が返されることです。また、メソッドが ID の値を返すようにしようとしましたが、MyClass の外で同じ問題に遭遇しました

これは私がそれを実装するのに問題があるところです

public class CharacterEditor {

public static void main(String[] args) throws IOException{ 

    MyClass iw= new MyClass();
    int theID=iw.ID;
    System.out.println(theID);

} }

4

2 に答える 2

1

クラスとその責任を分割する必要があります。モデルクラス (ゲーム キャラクターを表すクラスと、ゲームに必要な計算を行うクラス) が必要です。何かのようなもの

/**
 * A character from the game Toon.
 * @see http://en.wikipedia.org/wiki/Toon_(role-playing_game)
 */
public class Toon implements Serializable {
    private int muscle;
    private int zip;
    private int smarts;
    private int chutzpah;
    private String name;
    private String species;
    // Constructor, getters, setters, etc.
}

JFramesカスタムと Swingのビュークラスが必要ですActionListeners。これらは、ID の検証やテキスト ファイルからのデータの読み取りでは機能しません。

あなたのMyClass(そしてそれはあなたが避けたい名前です。なぜなら、6ヶ月であなたがしようとしていたことを忘れてしまうからです)、そのすべてが剥奪され、コントローラーJFramesJButtonsなります. これと兄弟クラスはToons、テキスト ファイルから読み取り、モデル クラスに配置します。ビューからをリッスンしActionEvent、ユーザーが望んでいることを実行しようとし、モデルとビューを更新するか、ビューにエラーを報告してモデルをそのままにします。

于 2013-05-16T03:17:53.180 に答える
0

クラスでは、CharacterEditorインスタンス化するMyClassだけで、適切な値を呼び出して and に割り当てることはできません(checkID()コンストラクターで呼び出す場合を除きます)。IDstrId

MyClass iw= new MyClass();
iw.checkID(); // MISSING!
int theID=iw.ID;
System.out.println(theID);

ID がないcheckID()と、デフォルトで 0 (初期化されていないintメンバー変数に与えられるデフォルト値) になりstrIdnull. try-catch が、設定した値が他の場所で表示されるのを何らかの形で妨げているというあなたの考えは正しくありません。

中括弧を使用した他の Java 構成と同様に、try-catch はそれ自体Scopeを作成し、スコープ内で宣言されたものはすべてスコープ外では表示されません。ただし、変数がそのスコープ外に既に存在する場合 (あなたの場合の ID など)、そのスコープ内でその値に加えられた変更は、そのスコープ外にも反映されます。

また、メンバー フィールドを として宣言し、他のクラスでアクセスできるようにゲッター (および変更可能なプロパティのセッター) をprivate提供することをお勧めします。publicまた、ご@DaveNewton指摘のとおり、 の使用をelse ifお勧めします。

于 2013-05-16T03:24:11.140 に答える