Java paintComponent正在运行但未显示

时间:2013-12-01 22:09:50

标签: java swing paintcomponent jcomponent

所以我只想在屏幕的随机部分画一个正方形JComponent

public void paintComponent(Graphics g){
    Graphics2D g2d = (Graphics2D) g;
    if( this.good ){
        g2d.setColor(Color.green);
    }
    else{
        g2d.setColor(Color.red);
    }
    g2d.fillRect(this.x, this.y, this.w, this.h);
    System.out.println("painting");
}

这是通过repaint()

调用绘画的方法
private void stateChange(){

    double rand = Math.random();

    if (rand < 0.5){
        this.good = !this.good;
    }
    setLocation(this.x,this.y);
    repaint();
}

this.xthis.y不断变化,但我知道这有效。当我运行我的代码时,它会打印"painting"应该在哪里,但没有任何显示。我做错了吗?

额外代码:

这是我试图让它出现的内容:

\\in JComponent constructore
setOpaque(true);
setVisible(true);
setSize(this.w,this.h);

2 个答案:

答案 0 :(得分:3)

我的猜测:你有一个while(true)循环,它绑定了Swing事件线程,所以当你改变状态时,GUI不能重新绘制自己以显示它发生。无论是那个或你的JComponent的大小都非常小,太小而无法显示图像。

如果答案不仅仅是猜测,那么您需要使用相关代码提出更完整的问题。

请注意,paintComponent(...)方法覆盖缺少对super方法的调用。

注意:您可以通过在paintComponent中添加getSize()方法来测试JComponent的大小:

public void paintComponent(Graphics g){
    super.paintComponent(g);  // **** don't forget this.
    Graphics2D g2d = (Graphics2D) g;
    if( this.good ){
        g2d.setColor(Color.green);
    }
    else{
        g2d.setColor(Color.red);
    }
    g2d.fillRect(this.x, this.y, this.w, this.h);

    // TODO: ***** delete this lines
    System.out.println("painting");
    System.out.println(getSize());  // **** add this***
}

注意:您应该在您的组件上调用setSize(...)。它通常具有误导性,因为它经常被布局管理员忽略。

答案 1 :(得分:2)

基于您提供的示例代码,问题在于您实际上是在组件的可视空间边界上绘制出来的。

绘画时,Graphics上下文的左上角为0x0,Swing已根据组件的位置翻译Graphics上下文,因此...... < / p>

g2d.fillRect(this.x, this.y, this.w, this.h);

实际上(可能)绘画超出了组件的可视区域。例如,如果x位置为10y10,但高度和宽度仅为1010,则表示您在位置10x10上绘画,这将超出组件的可视空间,相反,你应该尝试类似......

g2d.fillRect(0, 0, this.w, this.h);

或者,根据您的示例代码,

public void paintComponent(Graphics g){
    Graphics2D g2d = (Graphics2D) g;
    if( this.good ){
        g2d.setColor(Color.green);
    }
    else{
        g2d.setColor(Color.red);
    }
    super.paintComponent(g2d);
}

...代替