JButton добавлен, но не виден

Я хочу создать игру Pong на Java. Я рисую все свои вещи с помощью метода paintComponent. В этом методе я вызываю другой метод "initBall". Этот метод рисует мяч в начальной позиции. Когда я умер, я хочу снова нарисовать свой мяч в начальной позиции, и я хочу добавить кнопку в центре моей панели с надписью «Нажмите escape, чтобы продолжить», а затем мяч начнет двигаться. Проблема в том, что моя кнопка не видна.

Помогите пожалуйста мне :)

Вот мой код:

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);
    }

спасибо


person MTHeadss    schedule 01.04.2012    source источник
comment
никогда не меняйте состояние компонента во время рисования! Вместо этого измените состояние (вызванное любым событием), затем при необходимости вызовите перерисовку/проверку.   -  person kleopatra    schedule 02.04.2012
comment
@kleopatra : Ахха, да, я забыл поймать эту штуку :( , это снова хорошее понимание :-)   -  person nIcE cOw    schedule 02.04.2012


Ответы (2)


После добавления кнопки внутри вашего inItBall(...) просто revalidate() вашего JPanel, как

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();
}
person nIcE cOw    schedule 01.04.2012
comment
@MTHeadss: Или вы можете вызвать repaint() после revalidate(), чтобы JButton появилось на JPanel, если только revalidate() не поможет. - person nIcE cOw; 01.04.2012
comment
Хе-хе, добро пожаловать и продолжайте улыбаться :-) - person nIcE cOw; 02.04.2012
comment
было бы правильно - за исключением того, что OP вызывает init изнутри paintComponent (см. мой комментарий к вопросу @MTHeadss) - person kleopatra; 02.04.2012

Попробуйте добавить setVisible(true);.

person ShinTakezou    schedule 01.04.2012