ユーザーの行数を制限する単純なアプリケーションがあります。行数の計算が正常に実行されました。documentListener を使用して、ユーザーからのイベントをキャプチャします。
しかし、ユーザーからの入力が指定された行数を超えた場合、ユーザーが再度入力できないようにしたい。ただし、ユーザーは入力した文字を削除できます。
setEditable (false) を使用してみましたが、このメソッドの結果、JTextArea は永久に編集できなくなりました。
これは私のコードです。
....
public Demo2() {
initComponents();
textArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
System.out.println("Current Line when method call : "+getLineCountAsSeen(textArea));
if (getLineCountAsSeen(textArea) > maxLine){
JOptionPane.showMessageDialog(null, "Max line : "+maxLine);
try {
textArea.getDocument().remove(textArea.getDocument().getLength()-2, 2);
} catch (BadLocationException ex) {
Logger.getLogger(Demo2.class.getName()).log(Level.SEVERE, null, ex.getMessage());
}
} else {
lblLineCount.setText(String.valueOf(currentLine));
}
}
@Override
public void removeUpdate(DocumentEvent e) {
System.out.println("Current Line when method call : "+getLineCountAsSeen(textArea));
if (getLineCountAsSeen(textArea) > maxLine){
JOptionPane.showMessageDialog(null, "Max line : "+maxLine);
try {
textArea.getDocument().remove(textArea.getDocument().getLength()-2, 2);
} catch (BadLocationException ex) {
Logger.getLogger(Demo2.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
textArea.setEditable(true);
lblLineCount.setText(String.valueOf(getLineCountAsSeen(textArea)));
}
}
@Override
public void changedUpdate(DocumentEvent e) {
System.out.println("Current Line when method call : "+getLineCountAsSeen(textArea));
if (getLineCountAsSeen(textArea) > maxLine){
JOptionPane.showMessageDialog(null, "Max line : "+maxLine);
try {
textArea.getDocument().remove(textArea.getDocument().getLength()-2, 2);
} catch (BadLocationException ex) {
Logger.getLogger(Demo2.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
textArea.setEditable(true);
lblLineCount.setText(String.valueOf(getLineCountAsSeen(textArea)));
}
}
});
}
public static int getLineCountAsSeen(JTextComponent txtComp) {
Font font = txtComp.getFont();
FontMetrics fontMetrics = txtComp.getFontMetrics(font);
int fontHeight = fontMetrics.getHeight();
int lineCount;
try {
int height = txtComp.modelToView(txtComp.getDocument().getEndPosition().getOffset() - 1).y;
lineCount = height / fontHeight + 1;
} catch (Exception e) {
lineCount = 0;
}
if (lineCount == 0) {
System.out.println("Not Set!");
return lineCount;
} else {
currentLine = lineCount;
System.out.println("currentLine : "+currentLine);
return currentLine;
}
}
....