2013-02-20 78 views
1

我想要使用getParent方法爲gamePanel定位球拍,但它返回0.它對框架工作正常,並且它也適用於面板,但我決定重寫很多代碼,現在我無法讓它工作。幫助表示讚賞:)getWidth()返回0爲面板

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Oppgave1 extends JFrame { 

    public static void main(String[] args) { 
     JFrame frame = new Oppgave1(); 
     frame.setTitle("Oppgave 1"); 
     frame.setSize(600, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    private JLabel jlbBallCount = new JLabel("Ballcount"); 
    private JLabel jlbTimer = new JLabel("Timer"); 
    private JButton jbtNewBall = new JButton("New Ball"); 

    private Racket racket; 
    private Ball ball; 

    public Oppgave1() { 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(jlbBallCount); 
     buttonPanel.add(jlbTimer); 
     buttonPanel.add(jbtNewBall); 

     JPanel gamePanel = new JPanel();  
     gamePanel.add(racket = new Racket (100, 60)); 
     gamePanel.add(ball = new Ball(10, 3, racket)); 

     this.add(gamePanel, BorderLayout.CENTER); 
     this.add(buttonPanel, BorderLayout.SOUTH); 
    } 

    public void paint(Graphics g){ 
     racket.draw(g); 
     ball.draw(g); 
    } 
} 
+2

你在哪裏調用'getWidth()'? – 2013-02-21 01:54:22

+1

@ Code-Guru我只是想知道同樣的事情。我還想知道爲什麼***需要知道面板的大小。依靠佈局管理器,它通常變得無關緊要。 – 2013-02-21 01:55:40

+0

@AndrewThompson看起來這可能是一款遊戲。使用通常需要的自定義繪畫,獲取組件的大小當然可能有用。當然,一個複雜的解決方案會將這些細節隱藏在適當的線性變換中。 – 2013-02-21 01:58:17

回答

2
  1. 不要忽略一個JFrame的paint()方法。

  2. 您將球拍和球添加到遊戲面板。遊戲面板現在將自動繪製這些組件。

  3. 如果您希望能夠移動這些組件,那麼您必須將佈局設置爲空,並初始設置組件的邊界。然後,當您想要移動組件時,您只需調用setLocation()方法,Swing會將組件繪製到新的位置。