为什么我的JButton根本不显示但仍然有效? (我知道它在哪里,所以我可以点击它)

时间:2016-12-08 01:40:42

标签: java swing jbutton actionlistener

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

2 个答案:

答案 0 :(得分:2)

你的很多代码都不正确。

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

  1. 调用ball.paintComponent()。面板将自动绘制添加到其中的任何组件。

  2. 获取子组件并对其调用repaint()。同样,该面板将绘制所有子组件。

  3. 调用setOpaque(...)。应该在类的构造函数中设置opaque属性。

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

    所以代码应该类似于:

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

答案 1 :(得分:0)

我不确定你是否在代码的其他地方有这个,但我没有看到你添加回到TheMenu。如果这是您的代码:

celcius(temp)

你需要这个:

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

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

但如果你把它添加到其他地方,请忽略它。