2017-05-06 1 views
0

Je crée un jeu de cartes pour une classe qui nécessite un dealButton pour distribuer une main de cartes et l'afficher dans le cadre. J'ai une boucle qui traverse la main donnée et crée et affiche les cartes correctement, mais quand ce code est déplacé du constructeur et dans ActionListener de dealButton, rien ne s'affiche.Ajout de JButtons en dehors du constructeur JFrame

Existe-t-il un moyen d'ajouter JButtons à l'image en dehors du constructeur?

Voici le code qui devrait afficher les mains:

deck.shuffle();

 Hand hands[] = deck.deal(4, 13); 

     GridBagConstraints handCon1 = new GridBagConstraints(); 
     handCon1.insets = new Insets(0, 0, 0, 0); 
     handCon1.gridy = 10; 

     int handSize = hands[0].getCards().length; 
     Card cards[] = hands[0].getCards(); 
     for(int i = 0 ; i < handSize ; i++){ 
      JButton card = new JButton(); 
      PlayCardListener playCard = new PlayCardListener(deck, cards[i], card); 
      card.addActionListener(playCard); 
      card.setIcon(new ImageIcon(cards[i].getImg())); 
      card.setBorder(null); 
      handCon1.gridx = i; 
      add(hand1); 
      hand1.add(card, handCon1); 
+0

Bienvenue sur Stack Overflow! Les questions qui cherchent une aide au débogage («pourquoi ce code ne fonctionne-t-il pas?») Doivent inclure le comportement souhaité, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un [mcve]. Vous dites seulement "quand je l'essaie en dehors du constructeur ça ne marche pas". Puis ** postez ** ce code qui ne fonctionne pas. Et la réponse à votre question est: OUI, c'est possible. – GhostCat

Répondre

0

Il est sûr possible:

public class Deal { 

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

    private JFrame frame; 
    private JTextField statusField; 
    private JButton dealButton; 
    private JPanel buttonsPanel; 

    private Deal() { 
     statusField = new JTextField("starting - press DEAL"); 
     statusField.setEditable(false); 

     dealButton = new JButton("DEAL"); 
     dealButton.addActionListener(this::doDeal); 

     buttonsPanel = new JPanel(); 

     frame = new JFrame(); 
     frame.add(dealButton, BorderLayout.PAGE_START); 
     frame.add(buttonsPanel, BorderLayout.CENTER); 
     frame.add(statusField, BorderLayout.PAGE_END); 
     frame.setSize(600, 200); 
     frame.validate(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private void doDeal(ActionEvent ev) { 
     buttonsPanel.removeAll(); 
     List<String> cards = Arrays.asList("A", "2", "3", "4", "5"); 
     Collections.shuffle(cards); 
     for (String text : cards) { 
      JButton button = new JButton(text); 
      button.addActionListener(this::doCard); 
      button.setActionCommand(text); 
      buttonsPanel.add(button); 
     } 
     statusField.setText("new buttons"); 
     frame.validate(); 
    } 

    private void doCard(ActionEvent ev) { 
     String text = ev.getActionCommand(); 
     statusField.setText(text); // just demo 
    } 
} 

Je soupçonne que le segment suivant de votre code:

for (...) { 
    ... 
    add(hand1); 
    hand1.add(card, handCon1); 

vérifier si elle est vraiment nécessaire d'ajouter hand1 dans la boucle (plusieurs fois) - mais juste une supposition sans savoir ce que c'est.

Quelques points à considérer:

  • composants Swing (JPanel, JButton, ...) ne doivent être modifiés sur le fil Dispatch Event (HAE) - ce qui est le cas pour le code exécuté dans le ActionListener
  • après mise en page des changements liés à la méthode validate devrait être appelé à (re) mise en page du composant
+0

Merci pour le conseil. J'ai résolu le problème en ajoutant simplement hand1.validate() et hand1.repaint() à la fin de la boucle. Maintenant, il fonctionne exactement comme prévu! – JustABoy