2013-12-05 2 views
1

Я работаю над апплетом Sudoku, я хочу сделать ячейки (расширяет JTextField), чтобы он принимал только целые числа от 0 до 9 и длину 1. Позже я ограничу это еще больше (так что это соответствовало бы правилам игры). Я начал:Сделать JTextField только одной цифрой

public Block(int[] blockNum){ 
     this.setLayout(new GridLayout(3,3)); 
     this.setBorder(new LineBorder(Color.BLACK,2)); 
     for(int i=0; i<CELL_COUNT; i++){ 
      cells[i] = new Cell(); // Cell extends JTextField 
      ((AbstractDocument)cells[i].getDocument()).setDocumentFilter(
        new MyDocumentFilter()); // <- this is relevant for this question 

      if(blockNum[i]!=0){ 
       cells[i].setNumber(blockNum[i]); 
       cells[i].setEditable(false); 
      } 
      this.add(cells[i]); 
     } 
    } 
} 

Здесь я пытаюсь фильтровать входные данные, для начала я просто попытался ограничить это целое и одна цифра, но мне кажется, что я могу ввести столько цифр, сколько я хочу и последняя строка не запускается.

Хотела помощь здесь, спасибо:

class MyDocumentFilter extends DocumentFilter 
{ 
    @Override 
    public void replace(DocumentFilter.FilterBypass fp, int offset 
        , int length, String string, AttributeSet aset) 
             throws BadLocationException 
    { 
     int len = string.length(); 
     boolean isValidInteger = true; 
     if (len>1 || !Character.isDigit(string.charAt(0))) isValidInteger = false; 


     if (isValidInteger) 
      super.replace(fp, offset, length, string, aset); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 
} 
+0

Почему бы не просто использовать 10 маленьких кнопок вместо этого? – Domi

+0

Возможно, вам может быть полезен JFormattedTextField? http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html –

+0

Да, ['JFormattedTextField'] (http://docs.oracle.com/javase/7/docs/api/javax /swing/JFormattedTextField.html) вместе с ['MaskFormatter'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/text/MaskFormatter.html) выполнит эту работу. – Holger

ответ

0

Попробуйте использовать класс DocumentFilter. Это позволит вам проверить ввод до его фактического отображения. Вы также можете редактировать то, что у меня есть, чтобы проверить только целые числа.

JTextField tf = new JTextField(); 
AbstractDocument d = (AbstractDocument) tf.getDocument(); 
d.setDocumentFilter(new DocumentFilter(){ 
    int max = 1; 

    @Override 
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
     int documentLength = fb.getDocument().getLength(); 
      if (documentLength - length + text.length() <= max) 
     super.replace(fb, offset, length, text.toUpperCase(), attrs); 
    } 
}); 
+0

thank u, можно ли просто объяснить, зачем мне нужен метод insertString? похоже, что здесь работает только метод замены. – Yevgeni

+1

@YevgeniTarler. Вы правы, вы можете взять этот метод. –

Смежные вопросы