2016-12-08 41 views
1

在這個JPanel中,我的JButton「BackToTheMenu」在面板的頂部,我知道它在哪裏,所以我可以點擊它,但我看不到它。當我點擊它時,它會完美地將我帶到下一個面板。我如何讓它出現!?幫助真的很感激!爲什麼我的JButton根本不顯示,但仍然工作? (我知道它在哪裏,所以我可以點擊它)

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

1)爲了更好地幫助更快,發佈[MCVE]或[短的,獨立的,正確的示例](http://www.sscce.org /)。 2)'backToTheMenu'永遠不會添加到面板。 –

+0

'public void paintComponent(Graphics g) { super.paintComponent(g); ..'這個片段的最後一行,實現了..'(for Component child:getComponents()) { child.repaint(); }'..這個片段。 –

+0

你確定'ProjectileGame.gridButtonPressed()'沒有從其他地方調用嗎?你也可以在'actionPerformed()'中添加一些調試行,只是爲了驗證該操作是否在按鈕上執行? – Arvind

回答

0

我不確定你是否有代碼中的其他地方,但我沒有看到你添加backToTheMenu。如果這是你的代碼:

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

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

你需要這樣的:

add(backToTheMenu); 

但是忽略此如果添加其他地方。

+0

哦,是的,我忘了把它放在我的問題代碼中,但是我現在把它放回去了,它仍然不顯示。謝謝 –

2

很多你的代碼是不正確的。

繪畫方法僅用於繪畫。您不應該:

  1. 調用ball.paintComponent()。面板將自動繪製添加到其中的任何組件。

  2. 獲取子組件並在其上調用repaint()。同樣,面板將繪製所有的子組件。

  3. 調用setOpaque(...)。不透明屬性應該在類的構造函數中設置。

「返回菜單」按鈕不應該在此類中定義。它應該在父類中定義。

因此,代碼應該是這個樣子:

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

非常感謝您的幫助。如果我顯示一些來自父類的代碼,那麼你能告訴我如何實現這個你上面顯示的'計劃',因爲這是我第一次這樣做?我將如何去展示這個?此刻,我正在使用帶有兩個JPanel的cardLayout,一個menuPanel和gridPanel,此按鈕將我帶回menuPanel。這些JPanel都被添加到添加到JFrame上的contentPanel中。那麼我將如何去實施這個?謝謝 –

相關問題