所以我只想在屏幕的随机部分画一个正方形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.x
和this.y
不断变化,但我知道这有效。当我运行我的代码时,它会打印"painting"
应该在哪里,但没有任何显示。我做错了吗?
这是我试图让它出现的内容:
\\in JComponent constructore
setOpaque(true);
setVisible(true);
setSize(this.w,this.h);
答案 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
位置为10
且y
为10
,但高度和宽度仅为10
,10
,则表示您在位置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);
}
...代替