2

我一直在寻找,我找不到任何人可以解决这个问题。我正在制作一个游戏,在那个游戏中,我有可编辑的控件。控件窗口是一个单独的 JFrame,当我单击确认按钮时,它应该将 JTextFields(保存控件)中的项目写入文件。但这不起作用,所以我让它打印包含值的arraylist。这是代码:

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,并且 i 将值 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();,只是从文件中获取文本行。这有帮助吗?

编辑 2: 我只是在四处闲逛,发现如果我通过使用设置 JTextField 文本,setText("");那么使用getText();它就可以了。所以问题是当我手动更改它并使用 getText(); 它不会工作。为什么?

4

8 回答 8

2

要将文本更新为当前存在的 JTextField,我会将 JTextField 建立为类变量,并创建一个 setter/getter 方法来调整它(我假设您正在这样做)。

根据你的方法,你会使用类似的东西:

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

编辑:**第一个 setText 是 JTextField.setText,第二个 setText 是您发布的公共方法。我假设您的第二个 getText() 不起作用,因为您可能没有正确设置文本。

如果没有看到更多代码,我真的无法给出更好的猜测。

于 2012-10-06T19:13:57.527 回答
1

主要可能性:

(1) 文本字段的可编辑属性设置为 false。

(2) 您正在创建 JTextField 的多个副本,然后在屏幕上编辑一个新副本,但在获得值时引用旧副本。

(3) 您有一个 ValueChanged 或 LostFocus 事件处理程序,它将文本字段重置为其默认值

(4) 它实际上是 JFormattedTextField 而不是 JTextField

于 2012-10-11T20:35:50.613 回答
0

试试这个:

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

如果我是你,我会尝试调试程序。你可能会在你的代码中犯一些错误,你将无法通过检查代码来看到。

例如你调用函数的顺序等等,也许你这里有问题,或者你有几个线程,所以你尝试读取文本字段甚至没有设置它们等等......很难说没有审查整个代码。

因此,如果您使用 eclipse,您可以点击此链接了解如何调试:http ://www.vogella.com/articles/EclipseDebugging/article.html

Netbeans 或任何其他 IDE 也应该支持调试。

于 2012-10-11T09:45:42.440 回答
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();
}

它将每 1 秒打印一次 up 的值,以便您查看是否在一段时间后获得新值。如果是,那么答案是:您的 setText() 需要很长时间才能运行,并且您在设置新值之前正在读取该值

于 2012-10-13T13:40:18.530 回答
0

解决方案 以上答案都不适合我,所以我最终决定从那门课重新开始。我改变的几件事是我制作 JTextFields 的方式。我将它们作为一个数组而不是单个对象。其次是我表达他们所说的话的方式。当我初始化它们时,我无法让它们用参数中的文本创建。所以我不得不单独这样做。我更改了一些方法名称,以减少将来的混乱,它奏效了!所以我不确定这是怎么回事,也许这是我做的方式,也许只是侥幸。它有时会发生,所以我很抱歉耽搁和浪费您的时间!无论如何,感谢所有答案!

于 2012-11-01T17:27:33.877 回答