Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组件大小问题_Java_Swing_Graphics2d_Paintcomponent - Fatal编程技术网

Java 组件大小问题

Java 组件大小问题,java,swing,graphics2d,paintcomponent,Java,Swing,Graphics2d,Paintcomponent,我有一个JComponent子类,用于在屏幕上绘制形状。在构造函数中,我试图将ballX和ballY设置为JComponent的X和Y大小值的一半,我认为我做得不对。我现在已经查了很多,找不到补救办法。代码如下。请记住,这是我第一次真正的Swing/Graphics2D项目 public class PongCanvas extends JComponent { //Vars to hold XY values and Dimension values. private int bat

我有一个
JComponent
子类,用于在屏幕上绘制形状。在构造函数中,我试图将
ballX
ballY
设置为
JComponent
的X和Y大小值的一半,我认为我做得不对。我现在已经查了很多,找不到补救办法。代码如下。请记住,这是我第一次真正的Swing/Graphics2D项目

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);
    }
}
覆盖
JComponent
以返回首选尺寸,并从该
维度的一半宽度和高度开始。为此,这将调用中的
setPreferredSize()


附录:作为解释,您当前的方法失败了,因为
getWidth()
getHeight()
的结果是无效的,直到在封闭容器上调用了
validate()
,通常是由于以下原因。

我同意垃圾神的答案。(+1)

像这样移动
喷漆组件(g)
中的ballX和ballY

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

“Swing程序应该重写
paintComponent()
而不是重写
paint()
”。很抱歉,我不确定我是否完全理解您的意思。请通过重写两个方法更新示例,
paintComponent()
getPreferredSize()
。注释
@Override
会很有帮助。好的,谢谢。一旦我的开发机器启动并再次运行,我将进行更改(不断地出现内核恐慌)。+1用于建议一个新的解决方案。当然,
(0,0)
就变成了一种虫洞的入口!我经常使用
点p
然后检查
if(p==null)
以初始化起点。