Java repaint()方法不使用';尝试从面板中删除形状时无法工作
我想每秒钟画一些圆圈,并将它们全部(或至少一个)从面板中删除 以下是现有代码:Java repaint()方法不使用';尝试从面板中删除形状时无法工作,java,object,methods,repaint,Java,Object,Methods,Repaint,我想每秒钟画一些圆圈,并将它们全部(或至少一个)从面板中删除 以下是现有代码: public class DrawShape { ShapePanel panel; public DrawShape(ShapePanel panel) { this.panel = panel; Timer t = new Timer(); t.schedule(new TimerTask() {
public class DrawShape {
ShapePanel panel;
public DrawShape(ShapePanel panel) {
this.panel = panel;
Timer t = new Timer();
t.schedule(new TimerTask() {
long startTime = System.currentTimeMillis();
int secondsToRun = 3;
@Override
public void run() {
if (System.currentTimeMillis() - startTime > secondsToRun * 1000) {
panel.deleteCircle();
System.out.println("\t" + panel.circles.size());
cancel();
} else {
panel.addCircle(new Circle((int) (Math.random() * 200), (int) (Math.random() * 200)));
System.out.println(panel.circles.size());
}
}
}, 0, 1000);
}
}
如果时间大于3秒,请删除所有圆圈,否则继续在屏幕上绘制圆圈
以下是ShapePanel类:
public class ShapePanel extends JPanel {
public List<Circle> circles = new LinkedList<Circle>();
public ShapePanel() {
// Setting up the frame
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setVisible(true);
frame.setBackground(Color.black);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this); // adding the panel to the frame
}
public void addCircle(Circle circle) {
circles.add(circle);
this.repaint();
}
public void deleteCircle() {
// circles.remove(circles.get(0));
circles.clear(); //remove them all
this.repaint();
}
@Override
public void paint(Graphics g) {
for (Circle c : circles) {
g.setColor(Color.GREEN);
g.drawOval(c.x, c.y, Circle.radius * 2, Circle.radius * 2);
}
}
}
公共类ShapePanel扩展了JPanel{
public List circles=new LinkedList();
公共形状面板(){
//设置框架
JFrame=新JFrame();
框架。设置尺寸(500500);
frame.setVisible(true);
框架.立根背景(颜色.黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);//将面板添加到框架中
}
公共空间添加圆(圆){
圆。添加(圆);
这个。重新绘制();
}
公共循环(){
//圆.remove(圆.get(0));
圆圈。清除();//将它们全部删除
这个。重新绘制();
}
@凌驾
公共空间涂料(图g){
用于(圆c:圆){
g、 setColor(Color.GREEN);
g、 绘图椭圆(c.x,c.y,圆半径*2,圆半径*2);
}
}
}
当我调用deleteCircle()时,这些圆应该从列表中删除并重新绘制。我应该得到一个没有圆圈的空白屏幕。我认为在这种情况下,重新油漆不起作用
p.S.:第一次问问题,如果问题太长,我很抱歉:D所以,有两件事立刻向我扑来
java.util.Timer
java.util.Timer
在它自己的线程中运行,所以更新UI(或者在本例中,UI依赖的东西)可能会导致随机问题
<>我会考虑使用<代码> javax、Swing、Time< /Cord>,因为它在事件调度队列内被触发(通常使用起来更简单)
super.paint
paint
的功能,也没有接管它的职责,在本例中,这将是“准备”绘图的上下文
Graphics
是一个共享资源,它将传递给在绘制过程中更新的所有组件。这意味着它将包含以前绘制的内容
两项建议:
作为一般建议,最好覆盖paintComponent
而不是paint
(paint
做了很多重要的工作,所以除非你愿意做,否则通常会在绘制链中处于高位)
在进行任何自定义绘制之前,首先调用super.paintComponent
我强烈建议阅读:
及
我使用了super.paintComponent,它工作正常,即使我的背景颜色改变了(我认为它可以通过某种方式修复)。问题是,今天我从java graphics开始(我有一个应用程序要提交给学校),我呆了10-11小时,我仍然在尝试做研究、教程和其他工作。我会仔细看看你寄来的。谢谢你,先生!确保您只从paintComponent
中调用super.paintComponent
,不要从paint
中调用-您绕过了许多关键功能。首先,我应该看到它们之间的差异,似乎它们与我想象的大不相同。非常感谢你的帮助!