1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| public class DemoTextArea extends JTextArea { private final LastLineDocumentFilter documentFilter;
public DemoTextArea() {
documentFilter = new LastLineDocumentFilter();
addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ( "document".equals(evt.getPropertyName()) ) {
resetDocumentFilter((Document) evt.getOldValue());
setDocumentFilter((Document) evt.getNewValue());
}
}
});
setDocumentFilter(getDocument());
}
private void resetDocumentFilter(Document document) {
if ( document instanceof AbstractDocument ) {
((AbstractDocument)document).setDocumentFilter(null);
}
}
private void setDocumentFilter(Document document) {
if ( document instanceof AbstractDocument ) {
((AbstractDocument)document).setDocumentFilter(documentFilter);
}
}
private class LastLineDocumentFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String string,
AttributeSet attr) throws BadLocationException {
if(string == null) {
return;
} else{
replace(fb, offset, 0, string, attr); // simule un ajout par un replace (pour éviter duplication de code)
}
}
@Override
public void remove(FilterBypass fb, int offset, int length)
throws BadLocationException {
replace(fb, offset, length, "", null); // simule un effacement par un replace (pour éviter duplication de code)
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs) throws BadLocationException {
// méthode basique basée sur l'analyse du texte
String textInArea = getText(); // le text actuellement saisi
boolean canEdit=true; // saisie permise par défaut
for( int i=textInArea.length()-1; canEdit && i>=0; i--) {
// dés qu'on a un passage à la ligne et que la saisie en cours est avant, où sur, la position de ce passage à la ligne
// on interdit la saisie
if ( textInArea.charAt(i)=='\n' && offset<=i ) {
canEdit=false;
}
}
// on applique la modification si permis
if( canEdit ) {
fb.replace(offset, length, text, attrs);
}
/* autre méthode basée sur l'analyse des éléments (peut être amenée à être adaptée pour du html)
Document doc = fb.getDocument();
Element root = doc.getDefaultRootElement();
int count = root.getElementCount();
int index = root.getElementIndex(offset);
if(index==count-1) {
fb.replace(offset, length, text, attrs);
}*/
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DemoTextArea textpane = new DemoTextArea();
frame.getContentPane().add(new JScrollPane(textpane));
frame.setSize(300,300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
} |
Partager