텍스트 필드에 지정된 수만큼 입력 할 문자 수를 제한하는 DocumentFilter 클래스를 확장했습니다. 여기 내 SSCE의 :자바 텍스트 필드에서 마우스를 사용하여 문자 붙여 넣기/바꾸기 (지정된 글자 수 제한이 있음)
Main 클래스 :
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.net.*;
import java.io.*;
import java.util.Date;
import java.util.StringTokenizer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.text.PlainDocument;
public class Sandbox implements Runnable {
private JFrame frame;
private JTextField inputField;
private JButton searchButton;
private int MAX_CHAR_LIMIT = 1;
public Sandbox() {
inputField = new JTextField();
inputField.setColumns(10);
inputField.setFont(new Font(null, Font.BOLD, 20));
}
@Override
public void run() {
frame = new JFrame("SSCE");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500, 300));
PlainDocument doc = (PlainDocument) inputField.getDocument();
doc.setDocumentFilter(new DocumentCharLimitFilter(MAX_CHAR_LIMIT));
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(inputField);
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Sandbox());
}
}
DocumentCharLimitFilter 클래스 I 위의 프로그램을 해고하고 기존의 상단에 새로운 문자를 붙여 넣으려고
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class DocumentCharLimitFilter extends DocumentFilter {
private int MAX_CHAR_LIMIT;
public DocumentCharLimitFilter(int maxChars) {
this.MAX_CHAR_LIMIT = maxChars;
}
// You don't need insertString() when entering text in JTextField.
@Override
public void replace(FilterBypass fb, int offset, int length, String newText, AttributeSet aSet) throws BadLocationException {
int oldTextLength = fb.getDocument().getLength();
String oldText = fb.getDocument().getText(0, oldTextLength);
String combinedText = oldText + newText;
if (combinedText.length() <= MAX_CHAR_LIMIT) {
super.replace(fb, offset, length, newText, aSet);
// paste characters upto maximum allowed limit
} else if (oldTextLength < MAX_CHAR_LIMIT) {
int cutPosition = MAX_CHAR_LIMIT - oldTextLength;
String cutToFit = newText.substring(0, cutPosition);
super.replace(fb, offset, length, cutToFit, aSet);
} else {
System.out.println("Character limit of " + MAX_CHAR_LIMIT + " exceeded.");
}
}
}
문자를 Ctrl + V를 사용하여, 그게 나를 다른 방법으로 DocumentCharLimitFilter의 replace() 메소드 루프로 가져오고 :
글자 수 제한 1을 초과했습니다.
이 모든 것을 통해 내가 쥐고있는 새로운 문자와 Ctrl + V는 기존 문자 위에 추가 문자로 찍히고 위의 메시지가 표시됩니다. 문자를 입력 할 때 키보드를 사용할 때 잘 동작합니다. MAX_CHAR_LIMIT을 2로 늘리면 텍스트를 붙여 넣을 수 있지만 키보드에서 입력 할 때 원하지 않는 두 개의 문자를 입력 할 수 있습니다.
위의 코드를 기존 텍스트 상단에 일반 붙여 넣기와 같이 바꾸고 Ctr + V를 사용하고 키보드 문자를 지정된 한도로 제한하여 작동하도록하려면 어떻게해야합니까? 저는 자바 초보자입니다. 정보를 제공해야 할 경우 기꺼이 그렇게 할 것입니다. 고맙습니다.
업데이트 : @camickr, @VGR 너무 고마워요! replace()
메서드의 length
인수에주의를 기울이지 않았습니다. 이것은 내가 DocumentCharLimitFilter 클래스에 무슨 짓을 :
@Override
public void replace(FilterBypass fb, int offset, int length, String newText, AttributeSet aSet) throws BadLocationException {
System.out.println(fb.getClass());
int oldTextLength = fb.getDocument().getLength();
String oldText = fb.getDocument().getText(0, oldTextLength);
String combinedText = oldText + newText;
if (combinedText.length() <= MAX_CHAR_LIMIT) {
super.replace(fb, offset, length, newText, aSet);
// paste characters upto maximum allowed limit
} else if (oldTextLength < MAX_CHAR_LIMIT) {
int cutPosition = MAX_CHAR_LIMIT - oldTextLength;
String cutToFit = newText.substring(0, cutPosition);
super.replace(fb, offset, length, cutToFit, aSet);
// NEW CODE
// http://stackoverflow.com/questions/42512743/pasting-replacing-a-character-using-mouse-selection-in-java-textfield-with-spec
// length indicates number of characters highlighted using mouse or keyboard. This will work only when
// the entire text is highlighted (if entire text is not highlighted, it would get complicated)
// and when it is highlighted, I make sure that the new text to be pasted is within limits of the MAX_CHAR_LIMIT
} else if (length == MAX_CHAR_LIMIT) {
String correctedString = newText;
if (newText.length() > MAX_CHAR_LIMIT) {
correctedString = newText.substring(0, MAX_CHAR_LIMIT);
}
super.replace(fb, offset, length, correctedString, aSet);
} else {
System.out.println("Entered characters exceed specified limit of " + MAX_CHAR_LIMIT + "exceeded.");
}
}
[DocumentFilter 구현] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter)의 'DocumentFilter'를 사용하여 해당 필터가 작동하는지 확인하십시오. 그런 다음 코드를 작업 코드와 비교하여 다른 코드가 무엇인지 확인하십시오. – camickr
대체되는 기존 문자의 수를 포함하는 replace 메소드에 전달 된'length' 인수를 무시합니다. 또한, "JTextField에서 텍스트를 입력 할 때 insertString()이 필요 없다"는 것이 궁금합니다. 전에는 들어 본 적이 없어요. – VGR
@VGR 나는 문자가 대체되지 않는다고 생각한다. 새 문자가 이전 문자에 추가됩니다. 여기에 길이 인수를 어떻게 사용합니까? inserString()을 사용하면 호출되지 않습니다. 항상 replace()로 이동합니다. [이 항목 확인] (http://stackoverflow.com/questions/6844848/documentfilter-insert-never-called) – retrazil