2012-04-01 22 views
2

Ich möchte ein Pong-Spiel in Java erstellen. Ich zeichne alle meine Sachen mit meiner paintComponent Methode. In dieser Methode rufe ich eine andere Methode "initBall" auf. Diese Methode zeichnet den Ball an der Startposition. Als ich starb, möchte ich meinen Ball wieder auf die Init-Position zeichnen und ich möchte einen Knopf in der Mitte meines Panels hinzufügen, der sagt "Drücken Sie, um fortzufahren" und dann beginnt der Ball sich zu bewegen. Das Problem ist, dass meine Schaltfläche nicht sichtbar ist.JButton hinzugefügt, aber nicht sichtbar

Bitte helfen Sie mir :)

Hier ist mein Code:

public class PlayPanel extends JPanel implements ConstantesCommunes { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private int posX; 
    private int posY; 

    private boolean newBall = true; 

    private JPanel pan_WestZone = new JPanel(); 
    private JPanel pan_EastZone = new JPanel(); 

    private JButton but_Escape = new JButton("Press escape to continue !"); 

    Graphics2D graphics2d; 

    /* 
    * Constructeur de classe : PlayPanel.java 
    */ 
    // ============================================== 
    public PlayPanel() { 
     super(new BorderLayout()); 
     setBackground(Color.DARK_GRAY); 

     pan_WestZone.setPreferredSize(WESTPANEL_SIZE); 
     pan_EastZone.setPreferredSize(EASTPANEL_SIZE); 

     pan_WestZone.setBackground(ZONE_COLOR); 
     pan_EastZone.setBackground(ZONE_COLOR); 

     add(pan_WestZone, BorderLayout.WEST); 
     add(pan_EastZone, BorderLayout.EAST); 
    } 

    /* 
    * Ajouter la balle sur la surface de jeux 
    */ 
    // ============================================== 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     Graphics2D g2 = (Graphics2D) g; 

     posX = SCREEN_WIDTH/2; 

     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(Color.ORANGE); 

     initBall(g2); 

     // trait épais 
     g2.setColor(Color.LIGHT_GRAY); 

     g2.setStroke(new BasicStroke(10)); 
     g2.drawLine((SCREEN_WIDTH/2) - 5, SCREEN_HEIGHT, 
       (SCREEN_WIDTH/2) - 5, 0); 
    } 

    /* 
    * Initialiser la balle lorsqu'un joueur perd 
    */ 
    // ============================================== 
    private void initBall(Graphics2D graphics2d) {  

     but_Escape.setPreferredSize(new Dimension(100, 30)); 

     Graphics2D g2 = graphics2d; 
     g2.fillOval(SCREEN_WIDTH/2, 0, BALL_WIDTH, BALL_HEIGHT); 

     // The problem is here 
     add(but_Escape); 
    } 

dank

+2

_never-ever_ den Zustand der Komponente während des Malens ändern! Ändere stattdessen den Zustand (ausgelöst durch welches Ereignis auch immer), dann trigle ein Re/Paint/Validieren wenn nötig – kleopatra

+0

@kleopatra: Ahha, yeah Ich habe vergessen das Ding zu fangen :(, das ist wieder ein guter Einblick :-) –

Antwort

3

Nach dem Hinzufügen Button im inItBall(...) einfach revalidate() Ihre JPanel, wie

private void initBall(Graphics2D graphics2d) 
{  
    but_Escape.setPreferredSize(new Dimension(100, 30)); 

    Graphics2D g2 = graphics2d; 
    g2.fillOval(SCREEN_WIDTH/2, 0, BALL_WIDTH, BALL_HEIGHT); 

    // The problem is here 
    add(but_Escape); 
    revalidate(); 
} 
+1

@MTHeadss: Oder Sie können 'repaint()' nach 'revalidate()' aufrufen, damit 'JButton' im' JPanel' erscheint, wenn 'revalidate() 'alone gewonnen hat Hilf mir nicht. –

+0

Danke Budy, die mein Problem lösen;) – MTHeadss

+0

Hehe, du bist am meisten willkommen und bleib lächelnd :-) –

0

Try setVisible(true); hinzufügen.

+2

Nein mein Knopf ist schon sichtbar: \ – MTHeadss

+0

revalidation funktioniert? Wenn nicht, bin ich ahnungslos ... – ShinTakezou

Verwandte Themen