2016-12-08 1 views
1

Dans ce JPanel, mon JButton "BackToTheMenu" est en haut du panneau et je sais où il est si je peux cliquer dessus, mais je ne peux pas le voir. Quand je clique dessus, ça me mène parfaitement au panneau suivant. Comment puis-je l'amener à apparaître? L'aide est vraiment appréciée!Pourquoi mon JButton n'apparaît pas du tout mais fonctionne toujours? (Je sais où il est si je peux cliquer dessus)

public class GridPanel extends JPanel implements ActionListener 
{ 
    Ball ball = new Ball(); 
    Timer timer = new Timer(14, this); 

    JButton backToTheMenu = new JButton("To the Menu"); 

    public GridPanel() 
    { 
     setBackground(Color.WHITE); 
     setPreferredSize(new Dimension(900, 710)); 
     add(ball); 

     backToTheMenu.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent arg0) 
      {  
       ProjectileGame.gridButtonPressed(); 
      } 
     }); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     g.setColor(Color.RED); 
     g.fillRect(0, 649, 30, 33); 

     g.setColor(Color.BLUE); 

     for (int i = 0; i < 35; i++) 
     { 
      g.setColor(Color.GREEN); 
      g.drawLine(0, (20+(30*i)), 900, (20+(30*i))); 
      g.drawLine((30+(30*i)), 0, (30+(30*i)), 1000); 
     } 

     ball.paintComponent(g); 

     g.setColor(Color.RED); 
     g.drawLine(0, 650, 900, 650); 
     g.drawLine(30, 0, 30, 1000); 

     Graphics2D g2d1 = (Graphics2D)g; 

     g.setColor(Color.BLACK); 
     g2d1.drawString("X Displacement (metres)", 400, 667); 
     AffineTransform at = new AffineTransform(); 
     at.setToRotation(Math.PI/-1.97); 
     g2d1.setTransform(at); 
     g2d1.drawString("Y Displacement (metres)", -380, 8);  

     setOpaque(false); 

     for (Component child : getComponents()) 
     { 
      child.repaint(); 
     } 

    }     

    public void actionPerformed(ActionEvent e) 
    { 
     ball.ballPhysics(); 
     repaint(); 
     timer.restart(); 
    } 
} 
+0

1) Pour une meilleure aide plus tôt, poster un [MCVE] ou [Short, autoportantes correcte Exemple] (http://www.sscce.org /). 2) 'backToTheMenu' n'est jamais ajouté au panneau. –

+0

'public void paintComponent (Graphiques g) { super.paintComponent (g); ..' la dernière ligne de cet extrait, atteint .. 'pour (Composant enfant: getComponents()) { child.repaint(); } '.. cet extrait. –

+0

Êtes-vous sûr que 'ProjectileGame.gridButtonPressed()' n'est pas appelé ailleurs? Aussi pouvez-vous ajouter des lignes de débogage dans 'actionPerformed()', juste pour vérifier si cette action est effectuée sur le bouton? – Arvind

Répondre

0

Je ne suis pas sûr si vous avez cela ailleurs dans le code, mais je ne vous vois pas ajouter backToTheMenu. Si ceci est votre code:

public GridPanel() 
{ 
    setBackground(Color.WHITE); 
    setPreferredSize(new Dimension(900, 710)); 
    add(ball); 

    backToTheMenu.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent arg0) 
     {  
      ProjectileGame.gridButtonPressed(); 
     } 
    }); 
} 

Vous devez ceci:

add(backToTheMenu); 

Mais ne pas tenir compte si vous ajoutez ailleurs.

+0

Oh ouais, j'ai oublié de mettre ça dans mon code de question, mais je l'ai remis maintenant et il ne s'affiche toujours pas. Merci bien –

2

Une grande partie de votre code est incorrecte.

Une méthode de peinture est pour la peinture seulement. Vous ne devez pas:

  1. Appelez ball.paintComponent(). Le panneau peindra automatiquement tout composant ajouté.

  2. Récupérez le composant enfant et appelez repaint() sur eux. Encore une fois, le panneau va peindre tous les composants enfants.

  3. Appelez setOpaque(...). La propriété opaque doit être définie dans le constructeur de la classe.

Le bouton "retour au menu" ne doit pas être défini dans cette classe. Il devrait être défini dans la classe parent.

Ainsi, le code devrait ressembler à:

JButton back = new JButton("Back to the Menu"); 
back.addActionListener(...); 
frame.add(back, BorderLayout.PAGE_START); 
JPanel grid = new GridPanel(); 
frame.add(grid, BorderLayout.CENTER); 
+0

Merci beaucoup pour votre aide. Si je montre du code de la classe parente, pourriez-vous me montrer comment implémenter ce 'plan' que vous avez montré ci-dessus puisque c'est la première fois que je le fais? Comment pourrais-je montrer cela? J'utilise cardLayout avec deux JPanels en ce moment, un menuPanel et gridPanel et ce bouton me ramène au menuPanel. Ces JPanels sont tous deux ajoutés sur un contentPanel qui est ajouté au JFrame. Alors, comment pourrais-je mettre en œuvre cela? Je vous remercie –