我一直在寻找,我找不到能解决这个问题的人。我正在制作游戏,在那个游戏中,我有可编辑的控件。控件窗口是一个单独的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();它不会工作。为什么呢?
答案 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文本。所以我必须分开做。我改变了一些方法名称,以减少未来的混乱,并且它有效!所以我不确定那是什么,也许这就是我做的方式,也许只是一个侥幸。它有时会发生,所以我很抱歉延误和浪费你的时间!谢谢你的所有答案!