[JAVA] JInternalFrame JTextArea

JInternalFrame JTextArea [JAVA] - Programmation

Marsh Posté le 01-03-2002 à 10:16:04    

voila,
 
j'effectue un chat en swing et pour les differents chanel j'utitlise des JInternalFrame. Ceux-ci sont composés de JTextArea pour afficher les dialogues et d'un JTextField pour entrer son texte. Mon problème est que je ne retiens pas le texte d'une fenetre à une autre et lorsque je passe d'une JInternalFrame à une autre mon texte de la precedente disparait.
Je n'ai effectué aucune operation pour garder le texte dans les JTextArea et je desirerai savoir quelles sont les solutions envisagées ?
 
liste chainées, fichier, ou autre méthode que je ne connais pas et qui est associée aux JTextArea
 
si je ne suis pas très clair dites le moi :hello:

Reply

Marsh Posté le 01-03-2002 à 10:16:04   

Reply

Marsh Posté le 01-03-2002 à 10:24:03    

pas clair. Comprends pas pq tu veux passer d'une fenetre a une autre et pq tu dois garder le texte

 

[jfdsdjhfuetppo]--Message édité par DarkLord--[/jfdsdjhfuetppo]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 01-03-2002 à 10:29:52    

bien, comme sous mirc quand tu passes d'un channel à un autre, et bien le texte reste dans chaque fenetre. Moi quand je passe d'un channel à un autre le texte ne reste pas dans mon channel precedent. Quand je dis channel, c'est une JInternalFrame séparée en 2 avec en haut un JTextArea et en bas un JTextField.

Reply

Marsh Posté le 01-03-2002 à 10:34:41    

bin ca c'est vraiment bizarre !!!


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 01-03-2002 à 10:48:08    

package Chat;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.GridBagLayout;
import java.awt.event.*;
import java.io.*;
import java.util.*;
 
class FenetreClient extends JFrame implements ActionListener, FocusListener
{        
    private JMenuBar        menuBar;
    private JMenu           file;  
    private JMenuItem       exit, connectServer, joinChanel;
    private LunchServer     lunch;    
    private String          contenuMessage;            
    private JTextField      entree, dialogue;
    private JDesktopPane    desktop;
    private ArrayList       arrayList;
 
    public FenetreClient()  
    {
        super("client chat" );        
        setSize(800, 600);  
        //setResizable(false);        
        /* création des differents menus */
        /********************************/
        menuBar = new JMenuBar();
        setJMenuBar(menuBar);        
        file = new JMenu("File" );
        menuBar.add(file);              
        connectServer = new JMenuItem("connect server" );
        file.add(connectServer);
        connectServer.setEnabled(true);
        connectServer.addActionListener(this);        
        joinChanel = new JMenuItem("join chanel" );
        file.add(joinChanel);
        joinChanel.setEnabled(false);
        joinChanel.addActionListener(this);        
        exit = new JMenuItem("exit" );
        file.add(exit);
        exit.addActionListener(this);                        
        arrayList = new ArrayList();        
        /* création de la frame principale pour supporter les
 internes */        /***************************************************************/
        desktop = new JDesktopPane();
        Container contenu = getContentPane();
        contenu.add(desktop);                                
    }                
    public void actionPerformed(ActionEvent actionEvent)
    {
        if (actionEvent.getSource() == exit)
            System.exit(0);        
        if (actionEvent.getSource() == connectServer)
        {
            connectServer.setEnabled(false);                
            joinChanel.setEnabled(true);            
        }          
        if (actionEvent.getSource() == joinChanel)        
{            
String txtChanel = JOptionPane.showInputDialog(null, "Nom du Chanel à rejoindre ou créer" );
            if (txtChanel != null)
            {
               CreationChanel creationChanel = new CreationChanel(txtChanel, desktop);
               arrayList.add(creationChanel);
            }
        }
    }            
    public void focusGained(FocusEvent focusEvent)      
{    }        
public void focusLost(FocusEvent focusEvent)      
{                
               contenuMessage = new String(entree.getText());        
                             dialogue.setText(contenuMessage);              
    }        
}
/* gestion des fenetres non modales */
class CreationChanel extends JFrame implements ActionListener, FocusListener
{
    private JTextField              entree;
    private JTextArea               dialogue;
    private String     newline = "\n";        
public CreationChanel(String titre, JDesktopPane desktop)    
{
        /* création de frame internes pour les chanels de dialog */
        /*********************************************************/        
                JInternalFrame jInternalFrame = new JInternalFrame(titre, true, true); // resizable, closable        jInternalFrame.setBounds(10, 10, 300, 200);                dialogue = new JTextArea();
        dialogue.setEditable(false);
        dialogue.setLineWrap(true);
        dialogue.setWrapStyleWord(true);
        JScrollPane jScrollPane = new JScrollPane(dialogue);  
        // force l'affichage de la barre de defilement
        jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);        
        entree = new JTextField();        
        entree.setColumns(100);        
        // layout concernant l'internal frame        
        Container container = jInternalFrame.getContentPane();
        container.setLayout(new GridBagLayout());  
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.weighty = 0.9; /* ampleur du composant par rapport aux autres composants (ici 90% de la place)        */
constraints.weightx = 1.0; // ampleur du composant        constraints.gridx = 0; // position verticale        constraints.gridy = 0; // position horizontale        constraints.fill = GridBagConstraints.BOTH;        //container.add(dialogue, constraints);        container.add(jScrollPane, constraints);        
        constraints.weighty = 0.1; // ampleur du composant        constraints.gridy = 1;    
    constraints.fill = GridBagConstraints.BOTH;        
        container.add(entree, constraints);  
        entree.addFocusListener(this);
        entree.addActionListener(this);                
        desktop.add(jInternalFrame, 0);                                                
        jInternalFrame.setVisible(true);                  
        try        
{            
jInternalFrame.setSelected(true);        
}        catch(java.beans.PropertyVetoException ex){}
    }    
    public void actionPerformed(ActionEvent actionEvent)    
{        if (actionEvent.getSource() == entree)        
{            if ((entree.getText()).length() != 0)
            {
                dialogue.append(entree.getText()+newline);
                //dialogue.add(newline);
                entree.setText("" );          
  }
        }
    }
        public void focusLost(FocusEvent focusEvent)      
{        if (focusEvent.getSource() == entree)
        {
            String contenu = entree.getText();
            dialogue.setText(contenu);            
        }            
    }      
   public void focusGained(FocusEvent focusEvent)      
{    
}    
}
public class IGClient
{    
public static void main (String [] args)
    {
        FenetreClient fenetreClient = new FenetreClient();
        fenetreClient.setVisible(true);
        fenetreClient.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
}
 
voila le code c'est un peu plus simple à comprendre.
 
soyez indulgent cela fait peu que je pratique le java
:jap:

Reply

Marsh Posté le 01-03-2002 à 11:35:20    

bon j'ai eu la flemme de lire le code.
 
Mais sinon, pour ton texte, met le dans une variable globale. ça peut etre un String, ou peut etre plus optimisé... (a tester). Et donc, des que ta fenetre reprend le focus, tu met ta variable globale dedans (methode setText() si g bonne memoire). ET qd l'utilisateur tape un new msg (donc evenement dans ton JTextField), tu met a jours la variable globale et tu refet un setText() sur le JTextArea.
 
Et puis il faut penser a limiter la taille de ta variable globale qd meme ....

Reply

Marsh Posté le 01-03-2002 à 11:35:39    

ha oui et puis oublie les fichiers, ça sera trop lent

Reply

Marsh Posté le 01-03-2002 à 12:08:39    

la solution la plus propre c'est que le composant garde son état. Ce n'est pas normal qu'il perde ses données lorqu'il n'a plus le focus !


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 01-03-2002 à 13:02:41    

bin vouais, un attribut de la classe en String... variable "globale" quoi  ;)

Reply

Marsh Posté le 01-03-2002 à 14:30:32    

bien merci,
 
je pense faire dans ce cas une liste chainée ou une ArrayList.
Mais cela risque de pas mal bouffer de mémoire. Je vais chercher un peu des chats en open source pour voir la facon dont ils s'y prennent. Si je trouve la solution à mon problème je poste la solution.

Reply

Marsh Posté le 01-03-2002 à 14:30:32   

Reply

Marsh Posté le 01-03-2002 à 14:39:09    

La fenetre ne doit pas simplement conserver son contenu mais continuer à recevoir ce qui se passe sur le chan meme qd il n'est pas actif !
 
A mon avis, si tu ne souaite pas afficher plusieurs chan en meme temps, l'ideal est de ne gerer qu'une seule fentre avec un seul textfield et un seul textarea et de changer leur contenu au changement de chan.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed