Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中替换按下的字符_Java_Swing - Fatal编程技术网

如何在Java中替换按下的字符

如何在Java中替换按下的字符,java,swing,Java,Swing,当用户在JTextField中按下键盘上的“dot”键时,我希望透明地用逗号替换它。我试过这样的方法: jTextField.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent event) { if (event.getKeyCode() == KeyEvent.VK_DECIMAL) { event.setKeyChar(','); }

当用户在JTextField中按下键盘上的“dot”键时,我希望透明地用逗号替换它。我试过这样的方法:

jTextField.addKeyListener(new KeyAdapter() {
   @Override
   public void keyTyped(KeyEvent event) {
       if (event.getKeyCode() == KeyEvent.VK_DECIMAL) {
         event.setKeyChar(',');
       }
     }
});

但是它不起作用。

与其尝试将新密钥与已经发生的密钥事件相关联(我认为这是不可能的),不如尝试通过调用像
yourTextField.setText(“,”)这样的函数直接操作相关
JTextField
实例的文本在上面代码片段的if语句中。

替换文本字段中输入的明智方法是在文本字段的文档()上使用DocumentFilder。

谢谢大家的回答。 不错,更好的选择是编写文档过滤器,但我只需要在numpad上按下点字符,而不是在常规键盘上按下点字符时,才需要替换点字符

我知道我可以在keylistener中设置一个标志,然后在documentfilter中读取它,但这听起来有点太复杂了

多谢各位

Franco

以下是我的解决方案:

public class MyTextField extends JTextField {
private boolean substituteDot;

public MyTextField() {
  super();
  addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent event) {
      substituteDot = (event.getKeyCode() == KeyEvent.VK_DECIMAL);
    }
    @Override
    public void keyTyped(KeyEvent event) {
       if (substituteDot) {
         event.setKeyChar(',');
       }
     }
  });
 }
}
谢谢大家!

再见


Franco

不,在Swing中,你不应该使用如此低级的方法:-)而是使用DocumentFilter。在Swing中不要使用低级侦听器,而是使用DocumentFilter或JFormattedTextField。正如前面所述,
DocumentFilter
是解决这种情况的方法。希望这对主题有所帮助:-)应该使用
DocumentFilter
。这就是为什么将
DocumentFilter
API添加到API中的原因。过滤器的作用是在文本添加到文档之前过滤文本。文档调用了过滤器,因此无需通过重写文档来重新发明轮子(由于这个原因,这个答案确实值得否决)。此外,您创建的筛选器可能会在文本字段或文本窗格中重复使用,即使其中一个使用纯文档,另一个使用StyledDocument。@camickr不知道筛选器存在。更新了答案。
不知道过滤器存在。
kleopatra在发布答案之前对此主题发表了两条评论。请在发布前阅读所有答案/评论。