【问题标题】:JButton added, but not visible已添加 JButton,但不可见
【发布时间】:2012-04-15 13:03:42
【问题描述】:

我想用 Java 创建一个 Pong 游戏。我用我的paintComponent 方法绘制我所有的东西。在这种方法中,我将另一种方法称为“initBall”。此方法在起始位置绘制球。当我死后,我想再次将我的球画在初始位置,我想在面板的中心添加一个按钮,上面写着“按退出键继续”,然后球开始移动。问题是我的按钮不可见。

请帮帮我:)

这是我的代码:

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

谢谢

【问题讨论】:

  • 永远不会在绘画时改变组件的状态!相反,更改状态(由任何事件触发),然后根据需要触发重新/绘制/验证
  • @kleopatra :啊哈,是的,我忘了抓住那个东西 :( ,这又是一个很好的见解 :-)

标签: java swing panel jbutton paintcomponent


【解决方案1】:

尝试添加setVisible(true);

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

    • @MTHeadss :或者您可以在revalidate() 之后调用repaint(),以使JButton 出现在JPanel 上,如果单独使用revalidate() 将无济于事。
    • 呵呵,你很受欢迎,保持微笑:-)
    • 会是正确的 - 除了 OP 从paintComponent 内部调用 init (请参阅我对问题@MTHeadss 的评论)
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2020-02-07
    • 1970-01-01
    • 2012-05-09
    • 2018-08-18
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多