|
Dernière réponse | |
---|---|
Sujet : [JAVA] JInternalFrame JTextArea | |
JeromeV | 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. |
Aperçu |
---|
Vue Rapide de la discussion |
---|
JeromeV | 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. |
scaldan | 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. |
petoulachi | bin vouais, un attribut de la classe en String... variable "globale" quoi ;) |
darklord | 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 ! |
petoulachi | ha oui et puis oublie les fichiers, ça sera trop lent |
petoulachi | 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 .... |
scaldan | 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: |
darklord | bin ca c'est vraiment bizarre !!! |
scaldan | 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. |
darklord | 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] |
scaldan | 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: |