【问题标题】:keyTyped gives JTextField blankkeyTyped 给 JTextField 空白
【发布时间】:2017-03-02 17:06:38
【问题描述】:

无法解决这个问题。 我想用 keyTyped 检索我在文本字段上写的文本并将 int 放在字符串上。但如果我这样做,它会给我一个空白字符串。我能做什么?

textField_9.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e){
            xw = textField_9.getText(); //should retrieve my input 
        }
        public void keyTyped(KeyEvent e) {
            char c = e.getKeyChar(); 
            if((!(Character.isDigit(c)) && (c!='.'))){ 
                e.consume(); 
            }
            System.out.println(xw); //gives nothing ("") not null
            numero = e.getKeyChar();
            String fileName =  defaultx+"\\"+"Contratti"+"\\"+textField_7.getText()+"\\"+"lista"+tipo;
            Scanner scanner;
            try {
                scanner = new Scanner(new File(fileName));
                scanner.useDelimiter(":");

                while(scanner.hasNext()){
                    num = scanner.next();
                    System.out.println("Numero = "+num+"\t"+xw); //debug
                    dat = scanner.nextLine().replaceAll(":", "");   
                    if(num == xw){ 
                        try(Scanner scanner1 = new Scanner(dat)){
                            scanner1.useDelimiter(":");   
                            giorno = scanner1.next();
                            meset = scanner1.next();
                            anno = scanner1.next();
                            System.out.println(giorno+"-"+meset+"-"+anno); //debug

                        }catch(NoSuchElementException ex){

                        }
                    }else{
                        System.out.println("Dato non trovato");
                    }
                }
                scanner.close();
            } catch (FileNotFoundException e1) {

            } catch(NoSuchElementException e1){

            }

        }
    });

示例

我在我的 JTextField 中写入数字 "5" ,xw 应该是 "5" 但它会是 ""

【问题讨论】:

  • 所有这些代码都在做什么?对不起,但它看起来很乱。建议: 1)去掉key listener。您永远不应该将 keyListeners 添加到 Swing 文本组件,因为这会扰乱文本组件的固有功能(正如您所发现的那样)。而是使用 DocumentListeners 或 DocumentFilters,因为许多类似的问题答案会告诉您。 3)为什么每次激活侦听器时都要读取和重新读取文件?这看起来像您让程序执行不必要且昂贵的重复操作。不要这样做。读入文件一次。
  • 基本上我要做的是读取用户的输入,这个输入(这是一个数字)将在一个包含数字和日期列表的 .txt 文件中进行搜索。示例:.txt 文件的第一行是“1:1-01-2017”第二行是 2:8-01-2017”第三行是“3:15-01-2017 等等。所以我想要什么要做的是在这个 .txt 文件中搜索“:”之前的那个数字,当它找到它时,在另一个文本字段中写入日期。例子。用户在 textfield1 中写入“3”,程序将在 .txt 文件中搜索“:”之前的数字 3,找到后,将日期写入另一个文本字段。

标签: java swing keylistener


【解决方案1】:

基本上我要做的是读取用户的输入,这个输入(这是一个数字)将在一个包含数字和日期列表的 .txt 文件中进行搜索。示例:.txt 文件的第一行是“1:1-01-2017”第二行是 2:8-01-2017”第三行是“3:15:01:2017 等。

一次中读取此数据,而不是像您在上面尝试的那样每次按键都读取此数据,也许在类的构造函数中执行此操作。然后将数据存储在可搜索的集合中,可能是自定义类的数组列表。

所以我想做的是在这个 .txt 文件中搜索“:”之前的那个数字,当它找到它时,在另一个文本字段中写入日期。例子。用户在 textfield1 中写入“3”,程序将在 .txt 文件中搜索“:”之前的数字 3,找到后,将日期写入另一个文本字段。

保存文本文件数据的自定义类应在其自己的字段中保存单独的数字,并在需要时再次搜索这些对象的 ArrayList。

还有:

  • 不要将 KeyListener 添加到 JTextField,因为这会阻止 JTextField 正常运行(正如您所发现的那样)。
  • 我们有时会在 JTextField 的 Document 中添加 DocumentListener 或 DocumentFilter 以实现类似行为...
  • 但在你的情况下,我也不会这样做。而是将 ActionListener 添加到 JTextField,这是一个在按下 ENTER 键时激活的侦听器,并在此侦听器中搜索 ArrayList。
  • 您应该几乎永远有空的 catch 块,正如我们在上面的代码中看到的那样。至少打印出堆栈跟踪,因为您的代码会忽略它们,因此您很可能会在完全不知情的情况下完全抛出异常而遇到问题。

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 2011-12-13
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2019-04-02
    • 2019-12-30
    • 2015-01-03
    相关资源
    最近更新 更多