2

私はずっと探していましたが、この問題を解決できる人を見つけることができません。私はゲームを作っていますが、そのゲームには編集可能なコントロールがあります。コントロール ウィンドウは別の JFrame であり、確認ボタンをクリックすると、(コントロールを保持している) JTextFields 内の項目がファイルに書き込まれます。しかし、それは機能していなかったので、代わりに値を保持する配列リストを出力しました。コードは次のとおりです。

public void writeControls() {
    ArrayList<String> al = new ArrayList<String>();

    al.add(up.getText());
    al.add(down.getText());
    al.add(left.getText());
    al.add(right.getText());
    al.add(jump.getText());
    al.add(duck.getText());
    al.add(attack.getText());

    for (int i = 0; i < al.size(); i++) {
         System.out.println(al.get(i));
    }
    System.exit(0);
}

問題は次のとおりです。最終的な JTextFieldattackまたはその他のものを変更して送信をクリックすると、システムはデフォルトのコントロールを出力します。たとえば、JTextField の値が w、a、s、d、r、t、q の場合、値 q を i に変更すると、q が出力されます。私は何を間違っていますか?前もって感謝します!

編集1:

テキストフィールドのコードであり、これFILES....は単に別のクラスに格納された文字列です。クラスsetText()はテキストフィールドの下にあります。

up = new JTextField(setText(FILES.controlsFileFinalDir, 1));
    down = new JTextField(setText(FILES.controlsFileFinalDir, 2));
    left = new JTextField(setText(FILES.controlsFileFinalDir, 3));
    right = new JTextField(setText(FILES.controlsFileFinalDir, 4));
    jump = new JTextField(setText(FILES.controlsFileFinalDir, 5));
    duck = new JTextField(setText(FILES.controlsFileFinalDir, 6));
    attack = new JTextField(setText(FILES.controlsFileFinalDir, 7));

public String setText(String fileDir, int lineNum) {
    String txt = "";
    txt = io.readSpecificLine(fileDir, lineNum);
    txt = switchCase(txt);

    return txt;
}

switchcase()これらが値を取得しているテキストファイルに書き込んだものだけを取得し、それらを翻訳します。そのため、値が 0 の場合、スペースなどに変換されio.readSpecificLine();ます。ファイルからテキスト行を取得するだけです。これは役に立ちますか?

EDIT 2: 私はただ遊んでいてsetText("");、使用して JTextField テキストを設定すると、getText();それが機能することがわかりました。問題は、手動で変更して getText(); を使用するときです。それはうまくいきません。なんで?

4

8 に答える 8

2

テキストを現在存在するJTextFieldに更新するには、JTextFieldをクラス変数として確立し、それを調整するためのsetter / getterメソッドを作成します(これは、実行していると想定しています)。

あなたの方法によると、あなたは次のようなものを使うでしょう:

up.setText(setText(FILES.controlsFileFinalDir, 7));

編集:**最初のsetTextはJTextField.setTextで、2番目のsetTextは投稿したパブリックメソッドです。テキストを正しく設定していない可能性があるため、2番目のgetText()が機能していないと思います。

より多くのコードを見なければ、私は本当により良い推測をすることはできません。

于 2012-10-06T19:13:57.527 に答える
1

主な可能性:

(1)テキストフィールドの編集可能プロパティはfalseに設定されています。

(2)JTextFieldsの複数のコピーを作成し、画面上で新しいコピーを編集していますが、値を取得するときに古いコピーを参照しています。

(3)テキストフィールドをデフォルトにリセットするValueChangedまたはLostFocusイベントハンドラーがあります

(4)実際にはJTextFieldではなくJFormattedTextFieldです。

于 2012-10-11T20:35:50.613 に答える
0

もし私があなたなら、プログラムをデバッグしようとします。コードをチェックするだけでは、おそらくコードで間違いを犯すことになるでしょう。

たとえば、関数をどの順序で呼び出すかなど、ここで障害が発生したり、複数のスレッドがあるため、テキストフィールドを設定せずに読み取ろうとしたりします...それなしで言うのは難しいですコード全体を見直します。

したがって、Eclipse を使用する場合は、次のリンクをたどってデバッグ方法の説明を参照できます: http://www.vogella.com/articles/EclipseDebugging/article.html

Netbeans またはその他の IDE もデバッグをサポートする必要があります。

于 2012-10-11T09:45:42.440 に答える
0

これを試して:

textbox.setText(setFile(args)); // your function for set file 
于 2012-10-06T18:44:44.487 に答える
0

解決策 上記の答えはどれもうまくいかなかったので、最終的にそのクラスからやり直すことにしました。私が変更したいくつかのことは、JTextFields の作成方法でした。個々のオブジェクトではなく配列として作成しました。2 つ目は、私が彼らの言うことを表現する方法です。それらを初期化したとき、パラメーター内のテキストを使用して作成することができませんでした。だから私はそれを別々にしなければなりませんでした。将来の混乱を減らすためにいくつかのメソッド名を変更しましたが、うまくいきました! 何が原因だったのかわからないので、多分それは私がやった方法だったのかもしれません。それは時々起こるので、あなたの時間の遅れと無駄を申し訳ありません! とにかくすべての答えをありがとう!

于 2012-11-01T17:27:33.877 に答える
0

これは奇妙なことのように思えるかもしれませんが、これはポインターの問題だと思います。渡す前に新しい文字列を作成すると、JTextField はそれを内部的に変更し、変更された値を求められたときに期待どおりに返すことができます。

down = new JTextField("" + setText(FILES.controlsFileFinalDir, 2));
// or
down = new JTextField(new String(setText(FILES.controlsFileFinalDir, 2)));
于 2012-10-12T18:06:23.413 に答える
0

次のことを試してみてください。

クラス Test.java を作成します

import java.util.ArrayList;
import javax.swing.JTextField;

public class Test implements Runnable {
    private ArrayList<JTextField> textFields = null;
    private ArrayList<String> stringList = null;

    public Test(ArrayList<JTextField> textFields, ArrayList<String> stringList) {
        this.textFields = textFields;
        this.stringList = stringList;
    }

    @Override
    public void run() {
        for ( JTextField textField : this.textFields )
            this.stringList.add( textField.getText() );
    }

}

getText()そして、「メソッド..」を使用する場所で、次のことを行います...

ArrayList<JTextField> textFields = new ArrayList<JTextField>();
// add all the JTextField to textFields
ArrayList<String> stringList = new ArrayList<String>();

Test test = new Test( textFields, stringList );
SwingUtilities.invokeLater( test );
// check if the stringList is populated.

これが機能する場合、何らかの理由で JTextField がテキストの「設定」を完了しておらず、終了する前に getText() が呼び出されたと私は信じています。私は以前に同様の問題を抱えていましたが、これはその時の私の問題を解決しましたが、それでも、これは完璧な解決策ではないかもしれません.

于 2012-10-13T04:30:48.740 に答える
0

まず、「setText()」メソッド名を「getTextFromFile()」のような名前に変更する必要があります。

次に、別のスレッドで新しいテキストを設定して読み取っている場合、値を読み取るメソッドが即座に実行されている間、ファイルシステムにアクセスしているため、 setText() が戻るのに時間がかかると思います

私は少しテストを実行しようとします:

public void test(){ // must be run after the JTextFields be initialized
    up.setText("TEST")
    System.out.println(up.getText());
    up.setText(setText(FILES.controlsFileFinalDir, 1));
    System.out.println(up.getText());
}

test() が正しい値を出力する場合、同じスレッドで新しい値を設定して読み取ると、正常に機能すると想定できます

私が行う他のテストは次のとおりです。

public void testThread(){
    new Thread(){
        public void run(){
            while(true){
                if(up!=null){
                    System.out.println(up.getText());
                }
                try{
                    Thread.sleep(1000);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }       
    }.start();
}

up の値を 1 秒ごとに表示するので、しばらくしてから新しい値を取得できるかどうかを確認できます。そうであれば、答えは次のとおりです。 setText() の実行に時間がかかり、新しい値が設定される前に値を読み取っています。

于 2012-10-13T13:40:18.530 に答える