Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 仅允许在JTextField中键入数字和符号(-)_Java_Swing_Jframe_Jtextfield_Documentfilter - Fatal编程技术网

Java 仅允许在JTextField中键入数字和符号(-)

Java 仅允许在JTextField中键入数字和符号(-),java,swing,jframe,jtextfield,documentfilter,Java,Swing,Jframe,Jtextfield,Documentfilter,我正在尝试创建一个数学测验,我只希望用户能够输入负数或正数。有什么办法吗?我曾想过使用正则表达式,但听说它们不好用。我尝试使用keylistener,但是如果用户粘贴了怎么办?我试图解析字符串以获得一个整数,但是负号不起作用 有什么想法吗 package com.quiz.ui; import java.awt.BorderLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import jav

我正在尝试创建一个数学测验,我只希望用户能够输入负数或正数。有什么办法吗?我曾想过使用正则表达式,但听说它们不好用。我尝试使用keylistener,但是如果用户粘贴了怎么办?我试图解析字符串以获得一个整数,但是负号不起作用

有什么想法吗

package com.quiz.ui;

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class SSCCE {

    private JFrame frame;

    private JPanel contentPane;

    private JTextField usernameField;

    public static void main(String[] arguments) {
        new SSCCE().construct();
    }

    public void construct() {
        frame = new JFrame("Login");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(getContentPane());
        frame.pack();
        frame.setVisible(true);
    }

    public JPanel getContentPane() {
        usernameField = new JTextField(5);
        usernameField.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent arg0) {
                int keyCode = arg0.getKeyCode();
                if ((keyCode > 47 && keyCode < 58) || keyCode == 45) {
                    arg0.consume();
                }
                System.out.println(arg0.getKeyCode());
            }

            @Override
            public void keyReleased(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void keyTyped(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }
        });

        contentPane = new JPanel(new BorderLayout());
        contentPane.add(usernameField);

        return contentPane;
    }

}
package com.quick.ui;
导入java.awt.BorderLayout;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
公共级SSCCE{
私有JFrame;
私有JPanel内容窗格;
私有JTextField usernameField;
公共静态void main(字符串[]参数){
新的SSCCE().construct();
}
公共空间构造(){
frame=新JFrame(“登录”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(getContentPane());
frame.pack();
frame.setVisible(true);
}
公共JPanel getContentPane(){
usernameField=newjtextfield(5);
usernameField.addKeyListener(新的KeyListener(){
@凌驾
按下公共无效键(KeyEvent arg0){
int keyCode=arg0.getKeyCode();
if((键码>47&&keyCode<58)| |键码==45){
arg0.consume();
}
System.out.println(arg0.getKeyCode());
}
@凌驾
公共无效密钥已释放(KeyEvent arg0){
//TODO自动生成的方法存根
}
@凌驾
public void keyTyped(KeyEvent arg0){
//TODO自动生成的方法存根
}
});
contentPane=newjpanel(newborderlayout());
contentPane.add(usernameField);
返回内容窗格;
}
}
<代码> > p>可选地,考虑使用A也可能适用。

使用:

NumberOnlyFilter.java:

import javax.swing.*;
import javax.swing.text.*;
import java.util.regex.*;
public class NumberOnlyFilter extends DocumentFilter
{

    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
    {
        StringBuilder sb = new StringBuilder();
        sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.insert(offset, text);
        if(!containsOnlyNumbers(sb.toString())) return;
        fb.insertString(offset, text, attr);
    }
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException
    {
        StringBuilder sb = new StringBuilder();
        sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.replace(offset, offset + length, text);
        if(!containsOnlyNumbers(sb.toString())) return;
        fb.replace(offset, length, text, attr);
    }

    /**
     * This method checks if a String contains only numbers
     */
    public boolean containsOnlyNumbers(String text)
    {
        Pattern pattern = Pattern.compile("([+-]{0,1})?[\\d]*");
        Matcher matcher = pattern.matcher(text);
        boolean isMatch = matcher.matches();
        return isMatch;
    }

}
然后你可以像这样使用它:

((AbstractDocument)yourTxtField.getDocument()).setDocumentFilter(new NumberOnlyFilter());

您可以使用Integer.parseInt(字符串s,int基数),对于十进制,使用10作为redix值。

+1我总是想预编译模式,但分析的好处通常是微不足道的。问题是符号
-
也需要被允许。@Ron:Eng的建议很好(1+),您可以使用Eng的建议并允许-通过解析字符串以查看它是否是适当的数字表示,或者在筛选器中使用其他逻辑,很容易。找不到
adjustLabel(…)
方法。@Ron Oops,我总是从旧文件中复制此代码,而忘记删除
adjustLabel()
,抱歉:)使用此方法时,负号未通过测试。我尚未尝试代码,但此链接表示,它将返回负值,[link](,int))