Java 限制对JTextArea的输入
我目前正在为矩阵计算器编写一个开源代码。我试图实现的是让用户只在JTextArea中输入数字。数字包括负数和十进制数。我的问题如下:Java 限制对JTextArea的输入,java,swing,jtextarea,Java,Swing,Jtextarea,我目前正在为矩阵计算器编写一个开源代码。我试图实现的是让用户只在JTextArea中输入数字。数字包括负数和十进制数。我的问题如下: 如何将用户输入限制到JTextArea。JTextArea应该接受的输入是:数字(0-9)、空格和小数点。例如,如果用户按下字母“a”,该字母不会出现在JTextArea中,并且他/她会听到警告声。如果用户按下一个数字,例如“2”,则会将其添加到JTextArea中 或者我的第一个问题没有解决方案;这是我的另一种方法。如何将actionListener添加到JTe
我还没有对此进行任何编码,因为我不知道如何将操作侦听器添加到我的JTextArea。我尝试为您提供一个解决方案,它只接受0到9之间的数字和空格字符、点和新行字符,您可以根据需要添加和删除其他约束
jTextArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
// use your restriction logic here
// allow only numeric
Document doc = jTextArea.getDocument();
try {
String c = doc.getText(doc.getLength() - 1, 1);
if(c.equals("0") || c.equals("1") || c.equals("2") || c.equals("3") || c.equals("4") || c.equals("5") || c.equals("6") || c.equals("7") || c.equals("8") ||
c.equals("9") || c.equals("0") || c.equals(".") || c.equals("-") || c.equals(" ") || c.equals("\n")) {
} else {
String ss = doc.getText(0, doc.getLength()-1);
Runnable clearText = new Runnable() {
public void run() {
jTextArea.setText(ss);
}
};
SwingUtilities.invokeLater(clearText);
jTextArea.setText(doc.getText(0, doc.getLength()-1));
}
} catch (BadLocationException e2) {
// TODO: handle exception
}
}
@Override
public void changedUpdate(DocumentEvent arg0) {
}
});
这可能不是完美的解决方案,但它将帮助您完成任务谢谢@PramodYadav的帮助。我使用了您的代码片段,使用
java.awt.event.KeyEvent
并使用String c=character.toString(java.awt.event.KeyEvent.getKeyChar())读取每个按键,得出了以下结论:代码>。我相信其他人会有更好的解决方案。
请参阅下面的我的代码:
请让我知道我是否做得很好,并且我没有使用糟糕的编码方法。在JTextArea
的文档上使用DocumentFilter
,查看更多详细信息。关于如何使用JTextField
上的DocumentFilter
限制用户输入,有无数的例子,但概念是一样的,非常感谢大家。我使用了'code'java.awt.event.KeyEvent'code'并拾取每个按下的键,然后使用'code'字符串c=Character.toString(java.awt.event.KeyEvent.getKeyChar())进行检查;'当用户将文本粘贴到字段中时会发生什么?您的代码无法工作,正如已经说过的,很多次,最好的解决方案是使用DocumentFilter
Thank@MadProgrammer。我想我没有考虑过。我会按照你的建议重新编码。非常感谢,非常感谢@PramondYadav。我将您的代码片段与“代码”java.awt.event.keyEvent“代码”一起使用,这对我来说非常有用。非常感谢。DocumentFilter
是一个更好的解决方案,因为它不会冒从文档
生成变异异常的风险,因为在文档
发生变异时,您已经更改了组件,已经多次声明,KeyListener
不是筛选任何文本组件的正确选择,这就是为什么存在DocumentFilter
API,除了存在多个变异问题和不同平台执行不同操作的风险之外,这并没有考虑到如果用户将文本粘贴到组件或名为setText
的代码中可能发生的情况,在这两种情况下,这两种情况都会绕过您的侦听器代码,DocumentFilter
会捕捉到这一点
JTextArea.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
JTextAreaKeyTyped(evt);
}
});
private void taBKeyTyped(java.awt.event.KeyEvent evt) {
try{
javax.swing.text.Document doc = taA.getDocument();
String c = Character.toString(evt.getKeyChar());
if (c.equals("\b") || c.equals("0") || c.equals("1") || c.equals("2") || c.equals("3") || c.equals("4") || c.equals("5") || c.equals("6") || c.equals("7") || c.equals("8") || c.equals("9") || c.equals("0") || c.equals(".") || c.equals("-") || c.equals(" ") || c.equals("\n")) {
}
else {
javax.swing.JOptionPane.showMessageDialog(null, "Invalid key pressed. Please enter valid numbers, including:\n - Negative Numbers &\n - Decimal numbers");
String ss = doc.getText(0, doc.getLength()-1);
System.out.println(doc.getLength());
//using lambda expression
Runnable clearText;
clearText = () -> {
taA.setText(ss);
};
javax.swing.SwingUtilities.invokeLater(clearText);
JTextArea.setText(doc.getText(0, doc.getLength()-1));
}
}
catch(HeadlessException | BadLocationException e) {
System.out.println("Exception: " + e);
}
}