在此JPanel中,我的JButton“ BackToTheMenu”位于面板的顶部,我知道它在哪里,因此可以单击它,但看不到它。当我单击它时,它将带我到下一个面板。我如何显示它?非常感谢您的帮助!

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

最佳答案

您的许多代码不正确。

绘画方法仅用于绘画。你不应该:


调用ball.paintComponent()。面板将自动绘制添加到其中的任何组件。
获取子组件并在其上调用repaint()。同样,面板将绘制所有子组件。
调用setOpaque(...)。 opaque属性应在类的构造函数中设置。


不应在此类中定义“返回菜单”按钮。它应该在父类中定义。

因此,代码应类似于:

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

07-27 13:50