如何从 JTextField 获取字符串并将其保存在变量中的更新?

Posted

技术标签:

【中文标题】如何从 JTextField 获取字符串并将其保存在变量中的更新?【英文标题】:UPDATE of How to get string from JTextField and save it in variable? 【发布时间】:2021-04-19 18:18:28 【问题描述】:

我最近遇到了和 4 年前这个人一样的问题。他在那里得到了一些答案,但对他或我都不起作用,然后问题就不再更新了。 How to get string from JTextField and save it in variable?

关键是检查文本字段中输入的内容,如果,例如,文本字段中还有小数点,则使用事件并且不允许添加第二个小数点。

我发现的主要问题是我需要在关键事件中添加this,如图所示。但是事件中的this. 语句指的是事件本身而不是JTextField。所以我需要找到绕过或其他解决方案如何编写getText 语句

String text = this.getText().toString();

如果有人也有关于如何改进代码的想法,我愿意接受任何建议,除了将其重写为格式化字段,因为用户体验与我尝试格式化字段时略有不同。

public class TxtfNumber extends JTextField 

 String text = this.getText().toString();  

 public TxtfNumber()

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() 

            @Override
            public boolean dispatchKeyEvent(KeyEvent evt) 
                switch (evt.getID()) 
                    case KeyEvent.KEY_TYPED:
                            String text = this.getText().toString();
                            if(evt.getKeyChar()=='.'&& text.contains("."))
                               evt.consume();
                                 
                           
                            
                    

                    return false;
            
        );

 

【问题讨论】:

我正在尝试为带有小数的货币等创建自定义文本字段。 如果您使用 JTextField 输出货币金额,请使用用于格式化文本的字符串类。如果您使用 JTextField 进行输入,请使用 JFormattedTextField。除非您有更多经验,否则不要尝试创建自己的 Swing 组件。 当你声明一个在创建类时被实例化的类级变量时,你如何期望它有一个值,除非它在创建之前以某种方式有文本,它很明显它将是空的。除了说格式化的文本字段对您不起作用并且您在调用getText 时遇到问题之外,您没有给出任何最小的可重现示例或解释您想要实现的目标。你也知道java是开源的,所以你可以看看JFormattedTextField是如何工作的,并从那里借用代码。至少你应该有一个DocumentFilter JFormattedTextField source code 不,我首先运行它,在字段中写一些随机数。但是每次中风后的结果仍然是无效的。很抱歉没有说清楚我是新来的。这个文本字段的重点是尽量减少对减号、小数点和数字的输入。我不想使用格式化的文本字段,因为它有预先格式化的小数点,您需要通过箭头键跳过最终会减慢打字速度的内容。我正在为小型会计程序制作它,主要使用数字键盘,你有点键 使用DocumentFilter,正如我所说的,这里是一个例子***.com/a/14174868/1133011 【参考方案1】:

解决方案

当我使用 lambda 表达式时,我不小心在解决方案中运行。您需要使用的公式是类的名称,然后是.this。 所以在这种情况下,

String text = TxtfNumber.this.getText().toString();

是解决方案。

但最终,当我知道如何实现JTextField 时,我不再需要字符串的解决方案。所以我在这里给出整个代码供以后使用。随意将其用作选择 Bean 组件。

它限制用户在文本的开头只使用一个减号,在任何地方使用一个小数点,然后输入两个十进制数字。

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import javax.swing.JTextField;


public class TxtfNumber extends JTextField 



    public TxtfNumber()

 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() 
     @Override
     public boolean dispatchKeyEvent(KeyEvent evt) 
         switch (evt.getID()) 
             case KeyEvent.KEY_TYPED:
                 //restricts input charactes
                 if(!Character.isDigit(evt.getKeyChar()) && (evt.getKeyChar()!='.') && (evt.getKeyChar()!='-') && (evt.getKeyChar()!=','))
                     evt.consume();
                 
                 //change , and . for securing of different keyboard language
                 if (evt.getKeyChar()==',')
                     evt.setKeyChar('.');
                 
                 //allow only one decimal dot in text
                 if (evt.getKeyChar()=='.' && TxtfNumber.this.getText().contains(".")) 
                     evt.consume();
                 
                 //allow minus sign only at the start of text
                 if (evt.getKeyChar()=='-' && TxtfNumber.this.getText().length() != 0)
                     evt.consume();
                 
                 //allow two decimal numbers after dot
                 for (int i = -1; (i = TxtfNumber.this.getText().indexOf(".", i + 1)) != -1; i++) 
                     if (i+3 == TxtfNumber.this.getText().length()) 
                         evt.consume();
                 
                 break;
         
         return false;
     
 );

    
; 

【讨论】:

以上是关于如何从 JTextField 获取字符串并将其保存在变量中的更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取“JTextField 数组”的值并将其存储在 Array Integer 中?

如何从其他面板从 JTextField 获取输入

如何从存储过程中获取 SQL 字符串结果并将其保存在 C# Windows 应用程序字符串变量中

如何获取网页内容并将其保存到字符串变量中

是否可以使用 IF 语句从数据库中获取数据并将其保存到字符串中?

如何获取 ADLS Gen2 文件的最后修改日期并将其保存到 python 中的 csv