IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

JTextArea : Ecrire que sur la dernière ligne et bloquer le reste


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Apprenti Ingé
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Ingé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 8
    Points
    8
    Par défaut JTextArea : Ecrire que sur la dernière ligne et bloquer le reste
    Bonjour à tous ,

    J'ai un JtextArea qui me sert en quelque sorte de terminal et j'aimerais donc pouvoir écrire sur la dernière ligne mais que tout le reste, soit les lignes superieures restent intactes et qu'on ne puisse pas les modifier.
    Un setEditable(false); est trop "fort" car il bloque tout !

    Avez vous une solution ?

    Merci d'avance,

    Julian

  2. #2
    Invité
    Invité(e)
    Par défaut
    Couper la poire en deux.
    Faire une zone pour les entrées et une zone pour les sorties.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Apprenti Ingé
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Ingé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par chanyslas Voir le message
    Couper la poire en deux.
    Faire une zone pour les entrées et une zone pour les sorties.
    Merci de ta réponse !

    J'y ai pensé mais niveau esthétique c'est pas encore ça ! Surtout que j'utilise un GribBagLayout et j'ai du mal à voir comment intégrer ça sans changer l'affichage. Mais j'y réfléchie en même temps.

    Julian

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Utilises un DocumentFilter pour faire ça.

    Exemple :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
        }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Apprenti Ingé
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Ingé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    @joel.drigo
    Merci de ta réponse je suis bluffé !! Ca fonctionne parfaitement et tu m'as fais découvrir un peu plus les documents ! Je vais m'y pencher un peu plus ça à l'aire intéressant

    Merci beacoup !

    Julian

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si ça t'intéresse, voici le moyen d'ajouter un prompt pour chaque ligne, ou une numérotation des lignes. Combiner avec tu stylage, tu pourras mettre des couleurs différentes pour le prompt et le texte saisi également.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    public class DemoTextArea extends JTextArea {
     
        private static final String PROMPT = "> ";
        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 ) {
                String prompt=getPrompt();
                try {
                    ((AbstractDocument) document).replace(0, document.getLength(), prompt, null);
                } catch (BadLocationException e) {
                    e.printStackTrace();
                }
                ((AbstractDocument)document).setDocumentFilter(documentFilter);
                setCaretPosition(prompt.length());
            }
        }
     
     
        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);
                }
            }
     
            @Override
            public void remove(FilterBypass fb, int offset, int length)
                    throws BadLocationException {
                replace(fb, offset, length, "", null);
            }
     
     
            @Override
            public void replace(FilterBypass fb, int offset, int length,
                    String text, AttributeSet attrs) throws BadLocationException {
     
                Document doc = fb.getDocument();
                Element root = doc.getDefaultRootElement();
                int count = root.getElementCount();
                int index = root.getElementIndex(offset);
                Element current = root.getElement(index);
                String prompt = getPrompt();
                if(index==count-1 && (offset-current.getStartOffset()-prompt.length())>=0) {
                  if(text.equals("\n")) {
                      text = "\n" + prompt;
                  }
                  fb.replace(offset, length, text, attrs);
                }
     
            }
     
        }
     
        private String getPrompt() {
            return PROMPT;
            // pour numéroter les lignes 
            /*String text=getText();
            int linecount=1;
            if ( text.length()>0 ) {
                linecount++;
                int index=text.indexOf('\n');
                while(index>=0) {
                    linecount++;
                    index=text.indexOf('\n',index+1);
                }
            }
            return linecount + " : ";*/
        }
     
        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);
        }
     
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. lien "supprimer " que sur la dernière ligne d'un foreach
    Par pitu69 dans le forum MkFramework
    Réponses: 6
    Dernier message: 08/07/2013, 19h05
  2. [AC-2007] Comment être sur la dernière ligne d'un sous formulaire ?
    Par tibofo dans le forum IHM
    Réponses: 3
    Dernier message: 08/09/2010, 16h45
  3. [XL-2003] copier des cellules sur la dernière ligne
    Par chrnoe dans le forum Excel
    Réponses: 1
    Dernier message: 15/02/2010, 18h18
  4. [awk] modification différente sur la dernière ligne
    Par rfufu dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 01/02/2008, 10h03
  5. Parse error: unexpected $ sur la dernière ligne..
    Par zamoto dans le forum Langage
    Réponses: 6
    Dernier message: 01/06/2006, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo