2013-02-01 2 views
2

Au moment où j'écris une petite application client. J'ai une fenêtre avec une JTextArea (zone d'affichage pour la sortie du serveur) et une liste d'utilisateurs.gauche Masquer/composant droit d'un JSplitPane (ou autre mise en page)

Mon plan est d'afficher/masquer cette liste d'utilisateurs sur un élément de menu, mais je ne sais pas comment. Mes idées:

  • Utilisez un BorderLayout: sans JScrollPane pour la liste. Il fonctionne, mais je ne peux pas changer la largeur de la liste des utilisateurs (Parce que BorderLayout.WEST et BorderLayout.EAST ignorent la largeur)

  • Utilisez un BorderLayout avec un JScrollPane pour la liste des utilisateurs et afficher/masquer les JScrollPane -> Ne fonctionne pas, ne me demandez pas pourquoi ... de toute façon, cette façon n'est pas une bonne solution

  • Utilisez un JSplitPane, définissez le poids de redimensionnement à 0.9. Lorsque la liste des utilisateurs devrait disparaître, je minimise le bon composant (aka la liste des utilisateurs) -> Comment?

Mon code au moment:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.DefaultListModel; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTextArea; 


public class SplitPaneTest extends JFrame implements ActionListener 
{ 
    private JSplitPane splitPane; 
    private JTextArea textDisplay; 
    private JList<String> listUser; 
    private JScrollPane scrollTextDisplay; 
    private JScrollPane scrollListUser; 
    private JCheckBox itemShowUser; 

    public static void main(String[] args) 
    { 
     new SplitPaneTest(); 
    } 

    public SplitPaneTest() 
    { 
     setTitle("Chat Client"); 
     setMinimumSize(new Dimension(800, 500)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     textDisplay = new JTextArea(); 
     listUser = new JList<>(); 

     DefaultListModel<String> modelUser = new DefaultListModel<>(); 
     listUser.setModel(modelUser); 

     modelUser.addElement(new String("User 1")); 
     modelUser.addElement(new String("User 2")); 
     modelUser.addElement(new String("User 3")); 

     scrollTextDisplay = new JScrollPane(textDisplay); 
     scrollListUser = new JScrollPane(listUser); 

     splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
     splitPane.setLeftComponent(scrollTextDisplay); 
     splitPane.setRightComponent(scrollListUser); 
     splitPane.setResizeWeight(0.9); 
     setContentPane(splitPane); 

     JMenuBar menubar = new JMenuBar(); 
     JMenu menuWindow = new JMenu("Window"); 

     itemShowUser = new JCheckBox("Show user list"); 
     itemShowUser.addActionListener(this); 
     itemShowUser.setSelected(true); 

     menuWindow.add(itemShowUser); 
     menubar.add(menuWindow); 
     setJMenuBar(menubar); 

     setVisible(true); 
    } 

    public boolean isUserListEnabled() 
    { 
     return itemShowUser.isSelected(); 
    } 

    public void setUserListEnabled(boolean status) 
    { 
     scrollListUser.setVisible(status); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) 
    { 
     if(ae.getSource() == itemShowUser) 
     { 
      boolean status = isUserListEnabled(); 
      setUserListEnabled(status); 
     } 
    } 
} 

Et le résultat est:

enter image description here

Et caché JScrollPane scrollListUser:

enter image description here

Quelqu'un peut-il me donner un tipp? La liste d'utilisateurs est toujours visible (je pensais que le JSplitPane repeindrait ..). Je viens de Qt (C++) et dans Qt je pourrais utiliser un widget dock - mais Swing n'en a pas et utiliser des libs tiers .... Je ne sais pas - peut-être il y a une solution.

Répondre

4

On dirait que le splitPane ne peut pas gérer des composants invisibles bien - un moyen de sortir est d'ajouter/retirer le scrollpane selon le cas:

public void setUserListEnabled(boolean status) 
{ 
    splitPane.setRightComponent(status ? scrollListUser : null); 
    splitPane.revalidate(); 
} 
+0

Merci beaucoup;) – swaechter

Questions connexes