2012-01-16 2 views
2

Мне нужно, чтобы никакие символы не вводились после ввода буквы X. Мне нужно отправить звуковой сигнал после ввода символов X. Я знаю, как это сделать после нажатия пользователем ввода, но мне нужно сделать это до того, как пользователь нажмет клавишу ввода. Подход, который я нашел на сайте Oracle, - это добавить DocumentSizeFilter в JTextPane. Я не могу заставить это уведомлять пользователя, когда он перешел (он не работает, пока не нажимает клавишу ввода). Это образец того, что у меня есть.Как ограничить количество символов в JTextPane как типы пользователей (Java)

public class EndCycleTextAreaRenderer extends JTextPane 
implements TableCellRenderer { 

private final int maxNumberOfCharacters = 200; 

public EndCycleTextAreaRenderer() { 
    StyledDocument styledDoc = this.getStyledDocument(); 
    AbstractDocument doc; 
    doc = (AbstractDocument)styledDoc; 
    doc.setDocumentFilter(new DocumentSizeFilter(maxNumberOfCharacters)); 

} 
+2

рендерер никогда пищит ;-) Убедитесь, что вы понимаете концепцию визуализатора против редактора – kleopatra

ответ

6

insertString Переопределить метод документа в JTextPane так, что он не вставляет больше символов после того, как максимум был достигнут.

Например:

JTextPane textPane = new JTextPane(new DefaultStyledDocument() { 
    @Override 
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { 
     if ((getLength() + str.length()) <= maxNumberOfCharacters) { 
      super.insertString(offs, str, a); 
     } 
     else { 
      Toolkit.getDefaultToolkit().beep(); 
     } 
    } 
}); 

Update:

Вы можете изменить свой класс следующим образом:

public class EndCycleTextAreaRenderer extends JTextPane implements TableCellRenderer { 

    private final int maxNumberOfCharacters = 200; 

    public EndCycleTextAreaRenderer() { 
     setStyledDocument(new DefaultStyledDocument() { 
      @Override 
      public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { 
       if ((getLength() + str.length()) <= maxNumberOfCharacters) { 
        super.insertString(offs, str, a); 
       } else { 
        Toolkit.getDefaultToolkit().beep(); 
       } 
      } 
     }); 
    } 
} 
+1

+1, для более короткого подхода я собирался рассказать ему всю Библию в своем ответе, что вы сделали одним способом: -) С уважением –

+0

Прошу прощения за то, что я такой noob, но где я могу использовать этот код? Предполагается ли мой класс EndCycleTextAreaRenderer переопределить insertString? – Boundless

+3

+1 для 'beep()' :) –

0

Я хотел бы предложить проверку # символов с каждой клавишей вводится путем добавления keyReleasedListener, это что-то я в последнее время GUI шахты проверить границы, казалось бы, мгновенно и ошибку отображения пользователя, как они ввели.

Вот как я реализовал его на одном из моих TextFields:

carbonTextField.addKeyListener(new java.awt.event.KeyAdapter() 
{ 
     public void keyReleased(java.awt.event.KeyEvent evt) 
     { 
      carbonTextFieldKeyReleased(evt); 
     } 
}); 
+0

ли вы имеете в виду пользовательский keyListener? – Boundless

+0

Я отредактировал свое оригинальное сообщение, чтобы показать, как я добавил keyReleased Listener. Это позволяет вам проверять свои границы каждый раз (по сути, позволяя вам в свой собственный метод каждый keyPress, который позволит вам проверить звуковой сигнал или нет.) – Alex

+0

+1 для информации, которую вы дали, без сомнения, это хорошо, но теперь использование KeyEvents с Swing, как правило, не очень хорошая идея. С уважением –

2

Вот пример программы, для вас, где, как вы вводите в четвертый раз в TextPane он подаст звуковой сигнал, даже если вы не нажмете . Введите:

import javax.swing.*; 
import javax.swing.text.*; 

import java.awt.Toolkit; 

public class TextPaneLimit extends JFrame 
{ 
    private JPanel panel; 
    private JTextPane tpane; 
    private AbstractDocument abDoc; 

    public TextPaneLimit() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     panel = new JPanel(); 
     tpane = new JTextPane(); 

     Document doc = tpane.getStyledDocument(); 
     if (doc instanceof AbstractDocument) 
     {  
      abDoc = (AbstractDocument)doc; 
      abDoc.setDocumentFilter(new DocumentSizeFilter(3)); 
     } 

     panel.add(tpane); 

     add(panel); 
     pack(); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        new TextPaneLimit().setVisible(true); 
       } 
      }); 
    } 
} 

class DocumentSizeFilter extends DocumentFilter { 

    private int max_Characters; 
    private boolean DEBUG; 

    public DocumentSizeFilter(int max_Chars) { 

     max_Characters = max_Chars; 
     DEBUG = false; 
    } 

    public void insertString(FilterBypass fb 
          , int offset 
           , String str 
           , AttributeSet a) 
    throws BadLocationException { 

     if (DEBUG) { 

     System.out.println("In DocumentSizeFilter's insertString method"); 
     } 

     if ((fb.getDocument().getLength() + str.length()) <= max_Characters) 
     super.insertString(fb, offset, str, a); 
     else 
     Toolkit.getDefaultToolkit().beep(); 
    } 

    public void replace(FilterBypass fb 
         , int offset, int length 
         , String str, AttributeSet a) 
    throws BadLocationException { 

     if (DEBUG) { 
     System.out.println("In DocumentSizeFilter's replace method"); 
     } 
     if ((fb.getDocument().getLength() + str.length() 
      - length) <= max_Characters) 
     super.replace(fb, offset, length, str, a); 
     else 
     Toolkit.getDefaultToolkit().beep(); 
    } 
} 

Надеюсь, это поможет.

+0

Да, я пробовал этот пример из Сайт Oracle без ведома желаемого звукового сигнала, когда пользователь нажимает клавишу. – Boundless

+0

@Boundless: проверьте эту программу, я только что сделал, здесь вам не нужно нажимать клавишу Enter для подачи звукового сигнала. Просто попробуйте добавить четвертый символ, и он подаст звуковой сигнал. С уважением –

+0

Я попробовал, и он работает по мере необходимости. Спасибо, я попробую использовать его для моих нужд. – Boundless

0

Проверьте следующий код:

txtpnDesc.addKeyListener (новый KeyAdapter() {не

 @Override 
     public void keyTyped(KeyEvent e) { 
      if(txtpnDesc.getText().length() == 30) 
      { 
       e.consume(); 
      } 

     } 
    }); 
Смежные вопросы