Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    KeyListener

    Ciao, qualcuno sa di qualche evento o funzione che permetta di non inserire la lettera digitata?
    Mi spiego, io dovrei leggere dalla jTextPane che è stato premuto il backspace ma questo non dovrebbe essere inserito.
    ho provato anche con il metodo setKeyChar ma non so come settare di non fare nulla..
    codice:
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.*;
    import jcshell.shell.Shell;
    import javax.swing.JTextPane;
    
    
    public class Controller implements KeyListener {
    
      public JTextPane console;
     
      public Controller(JTextPane c) {
        console = c;
        
      }
    
      public void keyPressed(KeyEvent e) {
      }
    
      public void keyReleased(KeyEvent e) {
    	  
    	    	if (e.getKeyChar() == '\b'){	/*if backspace */
    	    		System.out.println("Non deve inseirlo");
    	    	}
    	    	
    	}
    
      public void keyTyped(KeyEvent e) {}
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: KeyListener

    Originariamente inviato da Paoletta_r
    Ciao, qualcuno sa di qualche evento o funzione che permetta di non inserire la lettera digitata?
    Mi spiego, io dovrei leggere dalla jTextPane che è stato premuto il backspace ma questo non dovrebbe essere inserito.
    Con un KeyListener non fai nulla, è solo una segnalazione dell'evento.

    Devi usare un filtro apposito. Leggi qui nella sezione "Implementing a Document Filter"
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Purtroppo non sono ancora riuscita a risolvere il problema, ho creato un DocumentFilter, ma il metodo insertString vuole una stringa, io dovrei passare un char.
    E poi posso richiamare il documentFilter dal metodo keyReleased.
    Io non devo far inserire alcuni tasti, ad esempio il tab.
    Illuminatemi vi prego

  4. #4
    Definisci un Document personalizzato (ridefinendo il metodo insertString) e poi lo imposti sul tuo JTextPane:

    codice:
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;
    
    
    
    
    public class MyDocument extends PlainDocument {
        
            public void insertString (int offset, String  str, AttributeSet attr) throws BadLocationException {
                 if (str == null) return;
            
                 char c = str.toCharArray()[0];
                 if (c != java.awt.event.KeyEvent.VK_BACK_SPACE) {
                       super.insertString(offset, str, attr);
                 }
            }    
    }
    Al mio segnale... scatenate l'inferno!

  5. #5
    Ciao, grazie per l'aiuto, ma non sono riuscita a risolvere del tutto.
    Come prova ho fatto un documento che imposta come limite massimo di caratteri inseriti 5;
    Ho inserito questo codice:
    codice:
     
    
        StyledDocument styledDoc = console.getStyledDocument();
        if (styledDoc instanceof AbstractDocument) {
            doc = (AbstractDocument)styledDoc;
            doc.setDocumentFilter(new MyDocumentFilter(5));
        } else {
            System.err.println("Text pane's document isn't an AbstractDocument!");
            System.exit(-1);
        }
       
    	
    	doc.addDocumentListener(new MyDocumentListener());
    MyDocumentListener
    codice:
     
     protected class MyDocumentListener implements DocumentListener {
    	  public void insertUpdate(DocumentEvent e) {
    		 
    	  }
    	  public void removeUpdate(DocumentEvent e) {
              
          }
          public void changedUpdate(DocumentEvent e) {
              
          }
    
      }
    Dove console è il mio JTextPane e MyDocumentFilter è il mio documento.
    Ho preso questo codice dalla sun, riadattandolo alle mie esigenze e il MyDocumentFilter l'ho copiato = ma non so perchè non fa quello che dovrebbe fare..cosa ho tralasciato?

  6. #6
    Ho provato ad usare anche io l'esempio della sun e mi funziona solo il limitatore... non riesco a risolvere il fatto del Back space :master:
    Al mio segnale... scatenate l'inferno!

  7. #7
    Ora mi da questo errore....

    Exception in thread "main" java.lang.IllegalArgumentException: Model must be StyledDocument
    at javax.swing.JTextPane.setDocument(Unknown Source)
    at jcshell.gui.Gui.<init>(Gui.java:152)
    at jcshell.gui.Main.main(Main.java:15)
    Sono riuscita a fare un sacco di cose strane con java ma questo document proprio non ne vuole sapere...

  8. #8
    Originariamente inviato da Paoletta_r
    Ora mi da questo errore....

    Exception in thread "main" java.lang.IllegalArgumentException: Model must be StyledDocument
    at javax.swing.JTextPane.setDocument(Unknown Source)
    at jcshell.gui.Gui.<init>(Gui.java:152)
    at jcshell.gui.Main.main(Main.java:15)
    Sono riuscita a fare un sacco di cose strane con java ma questo document proprio non ne vuole sapere...
    Si scusa ho sbagliato io... il codice che avevo postato non andava bene per JTextPane

    (ho modifcato il mio post precedente )

    Credo di aver risolto. Ho utilizzato l'esempio DocumentSizeFilter della sun ed è bastato ridefinire il metodo remove:

    codice:
    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.Toolkit;
    
    public class DocumentSizeFilter extends DocumentFilter {
        int maxCharacters;
        boolean DEBUG = false;
    
        public DocumentSizeFilter(int maxChars) {
            maxCharacters = maxChars;
        }
        public void remove (FilterBypass fb, int offs,int len){
            return ;
        }
        public void insertString(FilterBypass fb, int offs,
                                 String str, AttributeSet a)
            throws BadLocationException {
            if (DEBUG) {
                System.out.println("in DocumentSizeFilter's insertString method");
            }
    
            //This rejects the entire insertion if it would make
            //the contents too long. Another option would be
            //to truncate the inserted string so the contents
            //would be exactly maxCharacters in length.
            
            if ((fb.getDocument().getLength() + str.length()) <= maxCharacters){
                super.insertString(fb, offs, str, a);
            }
            else
                Toolkit.getDefaultToolkit().beep();
        }
        
        public void replace(FilterBypass fb, int offs,
                            int length, 
                            String str, AttributeSet a)
            throws BadLocationException {
            if (DEBUG) {
                System.out.println("in DocumentSizeFilter's replace method");
            }
            //This rejects the entire replacement if it would make
            //the contents too long. Another option would be
            //to truncate the replacement string so the contents
            //would be exactly maxCharacters in length.
            
            if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters){
                
                    super.replace(fb, offs, length, str, a);
                
            }
            else
                Toolkit.getDefaultToolkit().beep();
        }
    
    }
    e per settare il filtro:
    codice:
    StyledDocument styledDoc = tp.getStyledDocument();
    if (styledDoc instanceof AbstractDocument) {
                AbstractDocument doc = (AbstractDocument)styledDoc;
                doc.setDocumentFilter(new DocumentSizeFilter(5));
    }
    Al mio segnale... scatenate l'inferno!

  9. #9
    Grazie per l'aiuto che mi stai dando...avevo notato che qualcosina non funzionava...
    Sono 2 giorni che sto cambiando cancellando e modificando l'esempio della sun..ma niente..
    Anche aggiungendo quello che mi hai postato tu..non mi da errori ma non mi fa quello che deve fare.
    Pensare che quando il mio relatore mi ha detto di implementare questa parte ho pensato subito che fosse la parte più semplice..

  10. #10
    Forse sono io che sto fuso... e magari non ho capito cosa cerchi

    Potresti esporre meglio ciò che devi fare?

    Quali sono le limitazioni da imporre al JTextPane?
    Al mio segnale... scatenate l'inferno!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.