2011-11-05 67 views
2

我有一个JComponent子类,用于在屏幕上绘制形状。在构造函数中,我试图将ballXballY设置为JComponentXY大小值的一半,并且我认为我做错了。我现在查了很多,并找不到补救办法。代码如下。请记住,这是我第一次真正的Swing/Graphics2D风险投资。JComponent size issue

public class PongCanvas extends JComponent { 
//Vars to hold XY values and Dimension values. 

    private int batXDim, batYDim; 
    private int b1X, b1Y; 
    private int b2X, b2Y; 
    private int ballRad, ballX, ballY; 

    public PongCanvas() {//Instantiate vars. 
     batXDim = 20; 
     batYDim = 100; 

     b1X = 0; 
     b1Y = 0; 

     b2X = 0; 
     b2Y = 0; 

     ballRad = 20; 
     ballX = getWidth()/2; 
     ballY = getHeight()/2; 
    } 

    public void paint(Graphics g) {//Main paint Method. 
     //Cast Graphics to Graphics2D. 
     Graphics2D g2 = (Graphics2D) g; 
     //Enable antialiasing. 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     //Draw background. 
     g2.setPaint(Color.black); 
     g2.fillRect(0, 0, getWidth(), getHeight()); 
     //Draw ball. 
     g2.setPaint(Color.white); 
     g2.fillOval(ballX, ballY, ballRad, ballRad); 
     //Draw bat 1. 
     g2.fillRect(b1X, b1Y, batXDim, batYDim); 
     //Draw bat 2. 
     g2.fillRect(b2X, b2Y, batXDim, batYDim); 
    } 
} 
+3

“Swing程序应该重写'的paintComponent()'而不是'覆盖涂料()'。” - [绘画在AWT和Swing:Paint Methods](http://java.sun.com/products/jfc/tsc/articles/painting/index.html#callbacks)。 – trashgod

回答

5

覆盖getPreferredSize()JComponent来回报您的首选大小,并与Dimension的宽度和高度的一半开始。为此,KineticModelDisplayPanel中调用setPreferredSize()

附录:通过解释,当前的做法,因为从getWidth()getHeight()结果无效直到validate()被称为封闭的容器上,通常为pack()结果失败。

+0

对不起,我不确定我完全理解你的意思。 –

+0

通过覆盖“paintComponent()”和“getPreferredSize()'这两个方法更新您的示例。注解'@ Override'将被证明是有帮助的。 – trashgod

+0

好的,谢谢。一旦我的开发机器启动并再次运行,我将进行更改(不断收到内核恐慌)。 –

2

我同意trashgod的回答。 (+1)

移动ballX和BALLY在paintComponent(g)这样

if (ballX==0 && ballY==0) { 
    ballX = getWidth()/2; 
    ballY = getHeight()/2; 
} 
+0

+1用于提示[前哨值](http://en.wikipedia.org/wiki/Sentinel_value)。当然,'(0,0)'然后成为一种虫洞的入口!我经常使用'Point p;'并稍后检查'if(p == null)'来初始化起点。 – trashgod