我有一个小问题。我正在创建自己的小程序,其中包括二进制计算器。我已经创建了计算器,但我想要做的是将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
,因此必须在上述方法中执行检查
答案 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's
或0's
或backspace
或delete
,并会阻止任何其他输入..
希望这能解决你的问题..这对我有用