JTextField getText()不起作用

时间:2012-10-03 18:16:31

标签: java string swing io jtextfield

我一直在寻找,我找不到能解决这个问题的人。我正在制作游戏,在那个游戏中,我有可编辑的控件。控件窗口是一个单独的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);
}

问题是:如果我更改了最终的JTextField attack或任何其他问题,并单击“提交”,系统将打印出默认控件。例如,如果JTextFields具有值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: 我正在四处寻找并发现如果我使用setText("");设置JTextField文本,那么使用getText();就行了。所以问题是当我手动更改它,并使用getText();它不会工作。为什么呢?

8 个答案:

答案 0 :(得分:2)

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

根据您的方法,您可以使用以下内容:

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

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

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

答案 1 :(得分:1)

主要可能性:

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

(2)您正在创建JTextField的多个副本,然后在屏幕上编辑一个新副本,但是当您获得该值时,请参考旧的副本。

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

(4)实际上JFormattedTextField不是JTextField

答案 2 :(得分:0)

试试这个:

textbox.setText(setFile(args)); // your function for set file 

答案 3 :(得分:0)

如果我是你,我会尝试调试该程序。您可能会在代码中做一些错误,只需检查代码就无法看到。

例如你用什么顺序调用函数等等,也许你在这里有一个错误,或者你有几个线程,所以你试着读取Textfields而不用设置它们等等......这很难说不审查整个守则。

因此,如果您使用eclipse,可以按照此链接获取有关如何调试的说明:http://www.vogella.com/articles/EclipseDebugging/article.html

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

答案 4 :(得分:0)

这似乎是一个奇怪的建议,但我认为这是指针问题。如果在传入之前创建新字符串,JTextField将能够在内部更改它并返回您在请求修改后的值时所期望的。

down = new JTextField("" + setText(FILES.controlsFileFinalDir, 2));
// or
down = new JTextField(new String(setText(FILES.controlsFileFinalDir, 2)));

答案 5 :(得分: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()。我之前遇到过类似的问题,这解决了我的问题,但是,这可能不是一个完美的解决方案。

答案 6 :(得分:0)

首先,您应该将“setText()”方法名称更改为“getTextFromFile()”,以便更具可读性

然后,如果你在不同的线程中设置和读取新文本,我的赌注是setText()需要很长时间才能返回,因为它正在访问文件系统,而读取值的方法立即运行< / p>

我会尝试做一点测试:

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秒打印一次,这样您就可以看到一段时间后是否获得了新值。如果是,那么答案是:你的setText()需要很长时间才能运行,你在设置新值之前读取值

答案 7 :(得分:0)

<强>解 上述答案都没有对我有用,所以我最终决定重新开始上课。我改变的一些事情就是我制作JTextFields的方式。我把它们作为一个数组而不是单个对象。第二是我说出他们说的话。当我初始化它们时,我无法让它们在参数中创建WITH文本。所以我必须分开做。我改变了一些方法名称,以减少未来的混乱,并且它有效!所以我不确定那是什么,也许这就是我做的方式,也许只是一个侥幸。它有时会发生,所以我很抱歉延误和浪费你的时间!谢谢你的所有答案!