2013-02-20 79 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会将组件绘制到新的位置。