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

AWT/Swing Java Discussion :

Copier dans JTextArea


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Par défaut Copier dans JTextArea
    Bonjour,

    Voila j'ai un petit soucis de rapidité de copier dans un JTextArea . Cad, lorsque je colle une tres longue sequence (200000 lettre), je dois attendre un bon bout de temps avant que le sequence ne soit bien coller dans le JTextArea. J'aimerai savoir si cela est normal? et si il est possible de corriger cette lenteur?

    Merci

  2. #2
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    salut,

    ne peux tu pas essayer de fragmenter le texte à insérer, ajouter bloc par bloc via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textArea.getDocument().insertString(...) ?
    et pourquoi pas utiliser un SwingUtilities.invokeLater là dessus!?!

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Ton code pourrait également nous être utile (je soupçonne une concaténation de String via + dans une boucle)...

    a++

  4. #4
    Membre confirmé Avatar de philobedo
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 80
    Par défaut
    Idem pour moi j'ai un éditeur de texte dans lequel un utilisateur peut éditer des fichiers mais l'ouverture de certain fichier peut parfois prendre pas mal de temps!!
    C'est d'ailleurs pourquoi j'ai placé une JProgressBar (indeterminate) sur ma fenêtre le tout partagé dans deux Thread différent... Histoire que rien ne soit bloqué...
    Mais bon j'avoue que ce n'est pas la solution...

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par philobedo
    Idem pour moi j'ai un éditeur de texte dans lequel un utilisateur peut éditer des fichiers mais l'ouverture de certain fichier peut parfois prendre pas mal de temps!!
    Les fichiers sont si gros que ca pour que ca prennent autant de temps ???

    Mais la solution du thread est la plus propre pour éviter le blocage de l'interface (on peut utiliser la classe SwingWorker qui simplifie cela).

    a++

  6. #6
    Membre confirmé Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Par défaut
    En fait, je parle d'un coller durant l'execution de l'application. C'est a dire que lorsque je copie une sequence venant d'une autre source et que je veux la passer en parametre dans mon application par un JTextArea, le champ a du mal a se remplir...il se remplit en plusieur fois, puis place enfin la barre du scrollbar en bas...tout ca en bloquant l'application.
    Je ne pense pas que le "coller" dans le JTextArea apelle du code que j'ai implémenté, non? Je n'ai rien surcharger...j'utilise un JTextArea ordinaire.

  7. #7
    Membre confirmé Avatar de philobedo
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 80
    Par défaut
    Pour adiGuba:

    Par exemple un fichier de 300KO prend environ 2mn () pour s'afficher ...

  8. #8
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    2 mn!! ca parait juste un petit long

    Perso, je fais a peu près le même genre de truc via quelque chose comme ca :
    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
     
     
            BufferedReader lecteurAvecBuffer = null;
            String ligne;
     
            /* data constitue la partie de texte à ajouter au contenu du textPane */
            StringBuffer data = new StringBuffer();
     
            try
            {   lecteurAvecBuffer = new BufferedReader(new FileReader("${FILE}")); }
            catch(FileNotFoundException exc)
            {   ILogger.logMessage("Erreur d'ouverture !!!",ILoggingLevel.ERROR);
                ILogger.logException(exc);
            }
     
            try
            {   while ((ligne = lecteurAvecBuffer.readLine()) != null)
                {   data.append(ligne); }
     
                this.textPane.setText(data.toString());
     
                lecteurAvecBuffer.close();
            }
            catch(IOException e)
            {   e.printStackTrace(); }
    et même pour plus de 300Ko, ca prend pas des plombes.

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par philobedo
    Par exemple un fichier de 300KO prend environ 2mn () pour s'afficher ...
    Montre ton code tu dois surement avoir un problème...


    crochepatte >> Ok je n'avais pas compris le problème exact.
    Je viens de tester avec ce code :
    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
        public static void main(String[] args) {
     
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JFrame("TEST");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setSize(400,400);
                    frame.setLocationRelativeTo(null);
     
                    JButton exit = new JButton("Exit");
                    exit.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            System.exit(0);
                        }
                    });
     
                    frame.getContentPane().add(new JScrollPane(new JTextArea()));
                    frame.getContentPane().add(exit, BorderLayout.SOUTH);
     
                    frame.setVisible(true);
                }
            });
     
        }
    Et c'est vrai que la copie de long texte (entre 5 et 10 Mo) provoque des blocages voir plante carrément (OutOfMemoryError)... mais je n'ai pas pu voir d'où ca venait...

    Il faudrait chercher un peu sur bugs.sun.com pour voir si c'est un bug connu ou pas...

    a++

  10. #10
    Membre confirmé Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Par défaut
    Merci... je vais regarder si ce bug n'est pas referencer...mais j'avais deja regardé et rien trouver...j'aurai peut etre plus de chance cette fois ci!!!

  11. #11
    Membre confirmé Avatar de philobedo
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 80
    Par défaut
    Euh bon désolé de squater ce sujet....

    En fait j'ouvrais mes fichiers dans un JTextArea.

    J'ai essayé la solution avec le JTextPane mais ça ne marche po...
    En fait mon programme comporte une fenêtre principale à partir de laquelle il est possible de faire "Fichier" "Ouvrir" pour éditer des fichiers dans une autre fenêtre.
    Le tout chapoté par des Threads pour garder le contrôle de la fenêtre principale.

    Avec le JTextArea mon code était:
    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
     
    super("JProgressBar");
    float[] hsbvals = Color.RGBtoHSB(255, 228, 196, null);
    ReadIni readI = new ReadIni();
    champTexteEdIni = new JTextArea();
    champTexteEdIni.setLineWrap(true);
    champTexteEdIni.setWrapStyleWord(true);
    champTexteEdIni.setText(readI.simpleRead(fichier));
    jscroll = new JScrollPane(champTexteEdIni);
    champTexteEdIni.setCaretPosition(0);
    this.getContentPane().add(jscroll,
    		BorderLayout.CENTER);
    File f = new File(fichier);
    if (f.exists()) REPERTOIRE = f.getAbsolutePath(); 
    else REPERTOIRE = System.getProperty("user.dir");
     
    initGUI(); //initialisation de la fenêtre d'édition
    Avec cette méthode il faut ouvrir un fichier et partir déjeuner...

    J'ai ensuite essayé de faire la méthode avec le JTextPane:
    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
     
            super("JProgressBar");
    	float[] hsbvals = Color.RGBtoHSB(255, 228, 196, null);
    	ReadIni readI = new ReadIni();
    	BufferedReader lecteurAvecBuffer = null;
            String ligne;
     
            StringBuffer data = new StringBuffer();
            champTextPane = new JTextPane();
    	jscroll = new JScrollPane(champTextPane);
            champTextPane.setCaretPosition(0);
            try
            {	lecteurAvecBuffer = new BufferedReader(new FileReader(fichier)); }
            catch(FileNotFoundException exc)
            {      	System.out.println("Erreur d'ouverture !!!" + exc);
                   exc.printStackTrace(); }
            try
            {   while ((ligne = lecteurAvecBuffer.readLine()) != null)
                { data.append(ligne);   }
                this.champTextPane.setText(data.toString());
                lecteurAvecBuffer.close();
            }
            catch(IOException e)
            {   e.printStackTrace(); }
     
    	this.getContentPane().add(jscroll,
    			BorderLayout.CENTER);
    	File f = new File(fichier);
    	if (f.exists()) REPERTOIRE = f.getAbsolutePath(); 
    	else REPERTOIRE = System.getProperty("user.dir");
     
    	initGUI();
    Mais avec cette méthode quand j'ouvre un petit fichier tout se passe bien mais quand j'ouvre un gros fichier j'ai l'erreur suivante:

    javax.swing.text.StateInvariantError: infinite loop in formatting
    at javax.swing.text.FlowView$FlowStrategy.layout(FlowView.java:414)
    at javax.swing.text.FlowView.layout(FlowView.java:182)
    at javax.swing.text.BoxView.setSize(BoxView.java:379)
    at javax.swing.text.BoxView.updateChildSizes(BoxView.java:348)
    at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:330)
    at javax.swing.text.BoxView.layout(BoxView.java:682)
    at javax.swing.text.BoxView.setSize(BoxView.java:379)
    at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1599)
    at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:806)
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1275)
    at javax.swing.JEditorPane.getPreferredSize(JEditorPane.java:1212)
    at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
    at java.awt.Container.layout(Container.java:1020)
    at java.awt.Container.doLayout(Container.java:1010)
    at java.awt.Container.validateTree(Container.java:1092)
    at java.awt.Container.validateTree(Container.java:1099)
    at java.awt.Container.validateTree(Container.java:1099)
    at java.awt.Container.validateTree(Container.java:1099)
    at java.awt.Container.validateTree(Container.java:1099)
    at java.awt.Container.validate(Container.java:1067)
    at java.awt.Window.show(Window.java:461)
    at java.awt.Component.show(Component.java:1133)
    at java.awt.Component.setVisible(Component.java:1088)
    at pkgChTestCorpus.ChTestCorpusMain.editFile(ChTestCorpusMain.java:2287)
    at pkgChTestCorpus.ChTestCorpusMain.longTraitement(ChTestCorpusMain.java:1418)
    at pkgChTestCorpus.ChTestCorpusMain.run(ChTestCorpusMain.java:1404)
    at java.lang.Thread.run(Thread.java:534)
    ++
    Philobedo

Discussions similaires

  1. [Apache] Copier dans un répertoire sur le réseau
    Par licorne dans le forum Apache
    Réponses: 10
    Dernier message: 23/11/2005, 16h40
  2. Insertion de tableau dans JTextArea et MouseListener
    Par Janitrix dans le forum Composants
    Réponses: 1
    Dernier message: 05/11/2005, 01h08
  3. [javascript] copier dans le "clipboard"
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/08/2005, 14h10
  4. [KeyLister] Probleme dans JTextArea
    Par gl0be dans le forum Composants
    Réponses: 9
    Dernier message: 12/05/2005, 14h25
  5. [Débutant] Scrolls dans JTextArea
    Par k-reen dans le forum Composants
    Réponses: 2
    Dernier message: 30/06/2004, 16h14

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