2010-09-29 4 views
0

EDIT: Comme dans l'exemple (maintenant écrit par moi) ce que j'essaie de réaliser est d'empaqueter JLabel (+ JTextFields, pas dans l'exemple) dans JPanel avec FlowLayout et de trier ces panneaux avec BoxLayout un sous un autre mais en le limitant avec JScrollPane donc je peux spécifier la hauteur de la zone de vue et si ces JPanels (JLabels compressés) dépassent la hauteur que l'utilisateur doit faire défiler mais seulement verticalement.Tenter d'insérer JLabels dans JPanel à l'intérieur de JScrollPane

public class Example2 extends JFrame { 

    JScrollPane scrollPane = new JScrollPane(); 
    JPanel viewPanel = new JPanel(); 

    public Example2() { 
     setSize(400,300); 
     buildGUI(); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private void buildGUI() { 
     // SCROLLPANE PLACEMENT 
     GroupLayout layout = new GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(GroupLayout.LEADING) 
      .add(layout.createSequentialGroup() 
       .addContainerGap() 
       .add(scrollPane, GroupLayout.PREFERRED_SIZE, 350, GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(GroupLayout.LEADING) 
      .add(layout.createSequentialGroup() 
       .addContainerGap() 
       .add(scrollPane, GroupLayout.PREFERRED_SIZE, 223, GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 

     // REST 
     scrollPane.setViewportView(viewPanel); 
     scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
     viewPanel.setLayout(new BoxLayout(viewPanel, BoxLayout.Y_AXIS)); 


     for(int i=0; i<3; i++) { 
      JPanel panel = new JPanel(); 
      panel.setLayout(new FlowLayout(FlowLayout.LEADING)); 
      panel.setBackground(new Color(200,i*100,100*i)); 
      for(int j=0;j<20;j++) { 
       JLabel label = new JLabel("label "+j); 
       panel.add(label); 
      } 
      viewPanel.add(panel); 
     } 

    } 

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

} 
+0

Et votre question/problème est? –

+0

Il est de faire JLabels continuer sur la ligne suivante quand ils n'ont pas d'espace et faire JPanels qui les enveloppent seulement aussi grand que nécessaire pour envelopper JLabels et ne pas l'étendre sur toute la vuePanel – Martin

Répondre

0

Au lieu d'utiliser un wrapping layout manager, une alternative cheasy qui peut fonctionner dans un contexte très limité est d'utiliser JList avec un wrapping orientation:

JList list = new JList(new String[]{"lllllllllllllll", "abc", "ajdfkalfjlsjfjsakljflkajsd"}); 
list.setLayoutOrientation(JList.HORIZONTAL_WRAP); 
list.setVisibleRowCount(-1); // see setLayoutOrientation javadoc for why 
JScrollPane listScroller = new JScrollPane(list); 
listScroller.setPreferredSize(new Dimension(250, 20)); 
getContentPane().add(listScroller); 

Par défaut CellRenderer pour JList est JLabel, et vous pouvez définir le style de la liste de sorte qu'il ne ressemble pas à une liste (pas de frontière, pas de fond).

+0

comme je l'ai dit ci-dessus, je ne veux pas envelopper JLabels Je veux aussi emballer JTextField comme JLabel avec quelques lettres puis JTextField comme lettre manquante et continuer la fin du mot avec JLabel encore une fois c'est pourquoi je l'ai enveloppé dans JPanel avec FlowLayout qui contient exemple JLabel + JTextField + JLabel + JTextField + JLabel – Martin

+0

Puis-je demander ce que fait réellement votre application? Pourquoi avez-vous besoin d'utiliser des composants individuels pour chaque mot? –

+0

Eh bien, je vois où vous allez. Et je vais très probablement utiliser une approche différente bien que je ne l'ai pas excité pour être si difficile. – Martin