2012-10-03 43 views
2

我一直在寻找各地,我找不到任何人可以解决这个问题。我正在制作一款游戏,在那款游戏中,我拥有可编辑的控件。控件窗口是一个单独的JFrame,当我单击确认按钮时,它应该将JTextFields中的项目(控件)写入文件。但是这不起作用,所以我打印出了包含这些值的数组列表。这里是代码:JTextField getText()不起作用

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,并且我将值q更改为i,则会打印出q。我究竟做错了什么?提前致谢!

EDIT 1:对文本框

代码,并且FILES....是简单地存储在不同的类别的字符串。类setText()低于textfields。

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

没有看到更多的代码,包括JTextField的代码,这将很难提供帮助。 –

+0

请参阅编辑 – PulsePanda

+0

只需在执行任何控制功能之前尝试将文本打印到控制台,然后查看您是否获得了正确的结果。您的编辑仍然无法帮助...您可以从操作事件中粘贴代码。 – Mohsin

回答

0

SOLUTION 上述答案的是为我工作,所以我最后决定重新开始这个课程。我改变的几件事情就是我制作JTextFields的方式。我使它们成为一个数组而不是单个对象。其次是我放他们说的方式。当我初始化它们时,我无法让它们用参数中的文本创建。所以我不得不单独做这件事。我改变了一些方法名称,以减少未来的混乱,它的工作!所以我不知道那是怎么回事,也许是我这样做的方式,也许只是一种侥幸。它有时会发生,所以我很抱歉拖延和浪费你的时间!感谢所有的答案!

0

试试这个:

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

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

按照你的方法,你会使用类似:

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

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

没有看到更多的代码,我真的不能给出更好的猜测。

+0

我试过你的想法,但不幸它没有工作。你想让我把所有用于代码的类放在一起吗?或只是所有的方法?或者是什么。我不完全确定要为代码添加什么:\ – PulsePanda

0

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

例如,按照何种顺序调用函数等等,也许您在这里遇到了问题,或者您可能有多个线程,因此您尝试读取文本字段而无需设置它们等等......它是很难说没有审查整个守则。

所以,如果你使用Eclipse,你可以按照这个链接,就如何调试一个解释:http://www.vogella.com/articles/EclipseDebugging/article.html

Netbeans的或任何其他的IDE应该支持调试以及。

1

主要可能性:

(1)文本字段的可编辑属性设置为false。 (2)您正在创建JTextFields的多个副本,然后在屏幕上编辑一个新副本,但在获取该值时指的是旧副本。

(3)您有重置文本字段的默认值一的ValueChanged或LostFocus事件处理程序

(4)它实际上是JFormattedTextField上没有一个JTextField

+0

我们需要更多的代码才能给出更准确的答案 – Aubin

0

这似乎是一个奇怪的事情建议,但我认为这是一个问题与指针。如果您在传入新字符串之前创建了新字符串,则JTextField将能够在内部对其进行更改,并返回您在询问修改后的值时的期望值。

down = new JTextField("" + setText(FILES.controlsFileFinalDir, 2)); 
// or 
down = new JTextField(new String(setText(FILES.controlsFileFinalDir, 2))); 
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()。我以前遇到过类似的问题,这就解决了我的问题,但是,这可能不是一个完美的解决方案。

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()输出正确的值,则w E可假设,如果你设置,并在同一个线程读取新的值,它工作正常

其他测试我会做的是:

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()正在采取长期运行,并设置新的值之前,你正在阅读的价值

+0

第二部分:永远不会访问EDT上的摆动组件! – kleopatra