【问题标题】:JTextField getText() not workingJTextField getText()不起作用
【发布时间】:2012-09-24 17:32:20
【问题描述】:

我一直在寻找,我找不到任何人可以解决这个问题。我正在制作一个游戏,在那个游戏中,我有可编辑的控件。控件窗口是一个单独的 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 或任何其他的,然后单击提交,系统会打印出默认控件。例如,如果 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: 我只是在闲逛,发现如果我使用setText(""); 设置JTextField 文本,然后使用getText(); 它可以工作。所以问题是当我手动更改它并使用 getText();它不会工作。为什么?

【问题讨论】:

  • 看不到更多代码,包括 JTextField 的代码,这将很难提供帮助。
  • 在执行任何控制功能之前,只需尝试将文本打印到控制台,看看您是否得到正确的结果。您的编辑仍然无济于事..您能否从操作事件中粘贴代码。
  • 我认为错误可能在于您更改值的方式。您也可以添加此代码吗?
  • 请发SSCCE 重复您的问题。如果我可以将一些代码复制并粘贴到编辑器中,然后编译并运行它而无需任何额外工作,我将很乐意看一下。
  • 同意SSCCE,你的Bounty简单没用,没有发布SSCCE,提到FileIO应该存储为局部变量,没有人知道你的文件,也不知道休息或代码,...需要剂量运气和勇气在这里发表评论或发送答案,对不起:-)

标签: java string swing io jtextfield


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我试过你的想法,但不幸的是它没有奏效。你想让我把所有用于代码的类都放上去吗?或者只是所有的方法?要不然是啥。我不完全确定要为代码添加什么:\
【解决方案2】:

主要可能性:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        您可能想尝试以下方法:

        创建一个类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】:

          首先,您应该将“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() 需要很长时间才能运行,并且您在设置新值之前正在读取该值

          【讨论】:

          • 不知道第二部分:永远不要从 EDT 访问摆动组件!
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            试试这个:

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

            【讨论】:

              猜你喜欢
              • 2011-09-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-04
              • 2013-08-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多