2017-09-13 5 views
0

Je suis en train de créer un programme de base qui vise IUG à:Comment ajouter JPanel Dynamiquement et en le rendant cliquable?

  1. inserts Dynamiquement JPanel (le nombre de JPanel sera créé est la base de la taille de ma liste) qui est scrollable.
  2. Obtenez l'information du JPanel chaque fois que vous avez cliqué dessus.

Jusqu'à présent, ce que je l'ai fait:

... 

public class BeesFrame extends javax.swing.JFrame { 
    List<String> bees = new ArrayList<>(Arrays.asList("Bee 1", "Bee 2", "Bee 3", 
                "Bee 4", "Bee 5", "Bee 6", 
                "Bee 7", "Bee 8", "Bee 9", 
                "Bee 10", "Bee 11", "Bee 12", 
                "Bee 13")); 
    GridBagLayout layout = new GridBagLayout(); 

    JScrollPane scrollpane; 
    JPanel beesPanel; 
    JPanel beesCell; 
    JLabel label; 

    public BeesFrame() { 
     initComponents(); 
     label = new JLabel(); 
     for(int i = 0; i < bees.size(); i++){ 
      beesCell = new JPanel(); 
      beesCell.setName(bees.get(i)); 
      beesCell.setPreferredSize(new Dimension(100, 100)); 
      beesCell.setMinimumSize(new Dimension(100, 100)); 
      beesCell.setBackground(Color.yellow); 

      label.setHorizontalTextPosition(SwingConstants.CENTER); 
      label.setText(beesCell.getName()); 

      beesCell.add(label); 
      beesCell.validate(); 
      beesCell.repaint(); 
      System.out.println(bees.get(i)); 
     } 

     beesMainPanel.setLayout(new GridLayout((bees.size()/4)+1, 4, 1, 1)); 
     beesMainPanel.add(beesCell); 
     beesCell.setVisible(true); 
     beesCell.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e){ 
       JPanel panel = (JPanel) getComponentAt(e.getPoint()); 
       panel.setName(label.getText()); 
       outPut(panel); 
      } 
     }); 

     beesCell.validate(); 
     beesCell.repaint(); 

    } 

    void outPut(JPanel panel){ 
     System.out.println("Panel...."+panel.getName()); 
    } 

... // some other code generated by Netbeans 


} 

Mais au lieu d'afficher correctement. Seul le dernier de ma liste est inséré et si je l'ai cliqué, son javax.swing.JRootPane ne peut pas être converti en javax.swing.JPanel. Ceci est l'erreur se produit:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JRootPane cannot be cast to javax.swing.JPanel 
    at catchingbees.frame.BeesFrame$1.mousePressed(BeesFrame.java:79) 
    at java.awt.Component.processMouseEvent(Component.java:6530) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
    ... 

Voici la capture d'écran de mon sortie:

enter image description here

Mais ce que je voulais faire:

enter image description here

Toute aide est fortement appréciée.

+0

1) Pour une meilleure aide plus tôt, poster un [MCVE] ou [Short, autoportantes correcte Exemple] (http: //www.sscce.org/). 2) Voir [Qu'est-ce qu'une trace de pile, et comment puis-je l'utiliser pour déboguer mes erreurs d'application?] (Http://stackoverflow.com/q/3988788/418556) & [Qu'est-ce qu'une exception de pointeur nul, et comment Je le répare?] (Http://stackoverflow.com/q/218384/418556) –

Répondre

1

Ajoutez le MouseListener à chaque panneau, puis utilisez simplement la méthode getSource() de l'événement MouseEvent pour accéder au panneau sur lequel vous avez cliqué.

MouseListener ml = new MouseAdapter() 
{ 
    @Override 
    public void mousePressed(MouseEvent e) 
    { 
     JPanel panel = (JPanel)e.getSource(); 

     // do your processing on the panel 
    } 
} 

Puis dans la boucle qui crée les panneaux que vous faites simplement:

panel.addMouseListener(ml); 
+0

Merci monsieur pour votre aide. J'ai été en mesure d'obtenir des informations, mon problème restant est maintenant seulement les dernières données de ma liste est en cours de création. Comment ajouter toutes mes données de l'index 0 à l'index 9? Comme vous le voyez sur ma capture d'écran, seules les dernières données ont été insérées. Ce que je veux, c'est que comme je boucle à ma liste je vais créer son propre panneau pour ressembler à un GridView puis mettre tous les panneaux sur JScrollPane. –

+1

@AnirudhLou, qu'est-ce que vous attendez quand vous n'ajoutez que le panneau "beesCell" après "vous avez terminé la boucle?" Vous devez définir le gestionnaire de disposition du panneau avant de démarrer la boucle. Puis à l'intérieur de la boucle après avoir créé chaque panneau "beesCell", vous l'ajoutez au panneau en utilisant le GridlLayout. – camickr

+0

Merci beaucoup monsieur pour votre aide. Mon code fonctionne comme vous l'avez suggéré, seulement un mineur qui montre toujours une barre de défilement horizontale, est-il possible d'avoir une barre de défilement verticale? –