只有二​​进制格式输入

时间:2014-06-30 09:51:00

标签: java swing validation binary jtextfield

我有一个小问题。我正在创建自己的小程序,其中包括二进制计算器。我已经创建了计算器,但我想要做的是将jTextField中的用户输入仅限制为1和0。如果这不可能比用户输入1和0以外的任何其他内容时,用户将二进制转换(十进制)到十进制的按钮会在用户输入除1和0之外的任何内容时自动禁用。

我已经尝试过查看其他问题,但我认为这不是重复的问题。如果是的话,我道歉。

有人有任何想法吗?

编辑:

下面的代码是按钮的actionPerformed方法中使用的Bin到Dec转换器方法:

void BinToDec() {
        if (tfNumber.equals("")) {
            JOptionPane.showMessageDialog(null, "No values entered");
        }
        decList = new ArrayList<Integer>();
        try {
            int binary = Integer.parseInt(tfNumber.getText());
            if(binary >= 0) {
                int temp = binary;
                do {
                    decList.add(temp % 10);
                    temp /= 10;
                } while(temp > 0);
                w = 0;
                x = 0;
                sum = 0;
                for(int i = 0; i < decList.size(); i++) {
                    w = decList.get(i);
                    x = (int)Math.pow(2, i);
                    w = w * x;
                    sum = sum + w;  
                }
                result = Integer.toString(sum);
                tfBin.setHorizontalAlignment(tfBin.CENTER);
                tfBin.setText(result);
                JOptionPane.showMessageDialog(null, "Decimal for the binary number " + tfNumber.getText() + " is: " + result, "Decimal representation of a Binary number", JOptionPane.INFORMATION_MESSAGE);
                lblBin.setText(String.valueOf(result.replaceAll("[^\\dA-Za-z ]", "").trim()));

            } else {
                JOptionPane.showMessageDialog(null, "You didn't enter a correct value! Please enter only a positive number", "Error - Incorrect Value", JOptionPane.ERROR_MESSAGE);
            }
        } catch(NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, "You didn't enter a correct value! Please enter only a positive number", "Error - Incorrect Value", JOptionPane.ERROR_MESSAGE);
        }
    }   

编辑2:当用户输入数字并想要将其转换为二进制格式时,使用相同的JTextField,因此必须在上述方法中执行检查

4 个答案:

答案 0 :(得分:3)

我认为JFormattedTextField应该完成这项工作:有关详细信息,请参阅How to Use Formatted Text Fields

MaskFormatter binaryMask = MaskFormatter("#####"); //each # represents one valid character input
binaryMask.setValidCharacters("01"); // specifies that only the charaters '0' and '1' are allowed as input

JFormattedTextField field = new JFormattedTextField(binaryMask); // creates the test field using the binary mask

答案 1 :(得分:3)

为了验证Swing组件上的数据,您应该使用 InputVerifier Class

API Docs for InputVerifier处查看。

要确定给定的数字是否为二进制,您可以这样做:

  • 数字检查

    public boolean isBinary(int number){
        while (number != 0) 
            if(number % 10 > 1) return false;
            number /= 10;
        }
        return true;
    }
    
  • 字符串检查

    public boolean isBinary(String number){
        char[] ary = number.toCharArray();
        for(char c : ary) {
            if(!(c == '0' || c == '1')) return false;
        }
        return true;
    }
    

答案 2 :(得分:2)

您可以使用自定义DocumentFilter类来过滤JTextField上的输入。

首先,创建自定义DocumentFilter类:

import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;
import javax.swing.text.DocumentFilter;

public class BinaryFilter extends DocumentFilter {

    public void insertString(DocumentFilter.FilterBypass fb, int offset,
                             String string, AttributeSet attr)
            throws BadLocationException {

        StringBuffer buffer = new StringBuffer(string);
        for (int i = buffer.length() - 1; i >= 0; i--) {
            char ch = buffer.charAt(i);
            if (ch!='0'&&ch!='1') {
                buffer.deleteCharAt(i);
            }
        }
        super.insertString(fb, offset, buffer.toString(), attr);
    }

    public void replace(DocumentFilter.FilterBypass fb,
                        int offset, int length, String string, AttributeSet attr) throws BadLocationException {
        if (length > 0) fb.remove(offset, length);
        insertString(fb, offset, string, attr);
    }
}

然后,将其实施到您的JTextField

JTextField inputField = new JTextField();
Document inputFieldDoc = inputField.getDocument();
BinaryFilter tmpFilter = new DocumentFilter();
((AbstractDocument) inputFieldDoc).setDocumentFilter(tmpFilter);

答案 3 :(得分:2)

检查文本字段的keytyped事件。假设您有一个名为jTextField1的文本字段..然后您可以将其keytyped事件设置为:

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {                                     
    char c=evt.getKeyChar(); //get input from text field character by character
    if (!((c >= '0') && (c <= '1') || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))) 
    {
        getToolkit().beep();
        evt.consume();
    }
}   

以上代码只允许您输入1's0'sbackspacedelete,并会阻止任何其他输入..

希望这能解决你的问题..这对我有用