Java 如何增加重新绘制JPanel的频率?
我有一个简单的程序,可以画出从原点以一定速度和角度发射的粒子的轨迹。我创建了一个JPanel的子类来处理这张图的绘制。My everytime My子类被重绘时,它会获取当前时间和初始时间之间的差值(均以毫秒为单位),将其转换为秒,然后找到粒子在该时间点的位置的x和y坐标,最后获取这些x和y坐标并在屏幕上绘制它们。我的问题是,我的子类似乎以很长的间隔重新绘制,因为只显示了几个点 我的绘图方法:Java 如何增加重新绘制JPanel的频率?,java,swing,jpanel,paint,graphics2d,Java,Swing,Jpanel,Paint,Graphics2d,我有一个简单的程序,可以画出从原点以一定速度和角度发射的粒子的轨迹。我创建了一个JPanel的子类来处理这张图的绘制。My everytime My子类被重绘时,它会获取当前时间和初始时间之间的差值(均以毫秒为单位),将其转换为秒,然后找到粒子在该时间点的位置的x和y坐标,最后获取这些x和y坐标并在屏幕上绘制它们。我的问题是,我的子类似乎以很长的间隔重新绘制,因为只显示了几个点 我的绘图方法: private void doDrawing(Graphics g) { Dimension
private void doDrawing(Graphics g) {
Dimension size = getSize();
Insets insets = getInsets();
int w = size.width - insets.left - insets.right;
int h = size.height - insets.top - insets.bottom;
Graphics2D g2d = (Graphics2D) g;
g.drawString("Acceleration: -9.8m/s i", 0, 20);
StringBuilder b = new StringBuilder();
b.append("Current Velocity: ");
b.append(String.valueOf(sim.getVector(tickSpeed
* ((System.currentTimeMillis() - initTime) / 1000)).getMagnitude()));
b.append(" m/s at ");
b.append(String.valueOf(sim.getVector(tickSpeed
* ((System.currentTimeMillis() - initTime) / 1000)).getDirection().getDirectionDeg()));
b.append(" degrees");
g.drawString(b.toString(), 0, 30);
drawPreviousPoints(g2d);
drawCurrentPointAndAppend(g2d, w, h);
repaint();
}
private void drawCurrentPointAndAppend(Graphics2D g2d, int w, int h) {
g2d.setColor(Color.red);
double height = (length / w) * h;
Vector2D c = sim.getVector(tickSpeed
* ((System.currentTimeMillis() - initTime) / 1000));
double currentX = w
* ((sim.getX(tickSpeed
* ((System.currentTimeMillis() - initTime) / 1000))) / length);
double currentY = h
* (1 - ((sim.getY(tickSpeed
* ((System.currentTimeMillis() - initTime) / 1000))) / height));
g2d.drawLine((int) currentX, (int) currentY, (int) currentX,
(int) currentY);
g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_MITER));
g2d.drawLine((int) currentX, (int) (currentY),
(int) (currentX + w * (c.getX() / length)),
(int) (currentY + (h * -(c.getY() / height))));
xList.add(currentX);
yList.add(currentY);
}
private void drawPreviousPoints(Graphics2D g2d) {
g2d.setColor(Color.blue);
g2d.setStroke(new BasicStroke(7, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND));
if (!xList.isEmpty()) {
for (int i = 0; i < xList.size(); i++) {
g2d.drawLine(xList.get(i).intValue(), yList.get(i).intValue(),
xList.get(i).intValue(), yList.get(i).intValue());
}
}
}
private void doDrawing(图g){
维度大小=getSize();
Insets Insets=getInsets();
int w=size.width-insets.left-insets.right;
int h=尺寸.高度-插图.顶部-插图.底部;
Graphics2D g2d=(Graphics2D)g;
g、 抽绳(“加速度:-9.8m/s i”,0,20);
StringBuilder b=新的StringBuilder();
b、 附加(“当前速度:”);
b、 追加(String.valueOf(sim.getVector)(tickSpeed
*((System.currentTimeMillis()-initTime)/1000)).getMagnitude());
b、 附加(“m/s at”);
b、 追加(String.valueOf(sim.getVector)(tickSpeed
*((System.currentTimeMillis()-initTime)/1000)).getDirection().getDirectionDeg());
b、 附加(“学位”);
g、 拉丝(b.toString(),0,30);
绘图点(g2d);
绘制电流点和外观(g2d、w、h);
重新油漆();
}
专用void drawCurrentPointAndAppend(图形2D g2d、int w、int h){
g2d.setColor(Color.red);
双倍高度=(长度/宽度)*h;
Vector2D c=sim.getVector(速度
*((System.currentTimeMillis()-initTime)/1000);
双电流X=w
*((模拟getX(滴答声速度
*((System.currentTimeMillis()-initTime)/1000))/length);
双电流Y=h
*(1-()模拟快速
*((System.currentTimeMillis()-initTime)/1000))/height);
g2d.拉线((int)currentX,(int)currentY,(int)currentX,
(int)电流;
g2d.调整行程(新的基本行程(1,基本行程。卡普广场,
基本行程。连接(斜接);
g2d.拉线((内部)电流x,(内部)(电流y),
(int)(currentX+w*(c.getX()/length)),
(int)(当前y+(h*-(c.getY()/高度));
xList.add(currentX);
yList.add(当前y);
}
专用空心图纸先前点(图形2D-g2d){
g2d.setColor(Color.blue);
g2d.调整行程(新的基本行程(7,基本行程,
基本行程。加入轮);
如果(!xList.isEmpty()){
对于(int i=0;i
滴答声速度只是一个变量,我用它来加速或减慢粒子。它运行良好;然而,动画似乎很起伏
- 我如何修复这种波动(使一切看起来更“流畅”)
- 我应该在哪里调用repaint()?因为我觉得在我的绘图方法结束时调用它是不对的
- 摆动的一条重要规则-你不能控制喷漆过程
不要在
paintComponent
中执行这些计算。paintComponent
用于绘制用户界面的当前状态,并且可能由于多种原因随时被调用,其中大部分原因不在您的控制范围之内
取而代之的是,考虑使用<代码> javax、Swing、Time< /Cuff>集合以一个固定的间隔重复(40ms是每秒25秒)。 建立一个模型,跟踪当前处理的粒子。当计时器滴答作响时,计算粒子位置并更新它们,然后调用
repaint
在paintComponent
中,只需绘制模型的当前状态
看一看,了解更多细节摆动的一条重要规则-你无法控制绘画过程 不要在
paintComponent
中执行这些计算。paintComponent
用于绘制用户界面的当前状态,并且可能由于多种原因随时被调用,其中大部分原因不在您的控制范围之内
取而代之的是,考虑使用<代码> javax、Swing、Time< /Cuff>集合以一个固定的间隔重复(40ms是每秒25秒)。 建立一个模型,跟踪当前处理的粒子。当计时器滴答作响时,计算粒子位置并更新它们,然后调用
repaint
在paintComponent
中,只需绘制模型的当前状态
请查看并了解更多详细信息,绘制过程是内部处理的,因此无法控制其执行频率。
但是,您可以创建单独的线程或计时器,这些线程或计时器可以以所需的频率调用进程。使用“绘制”方法只能在画布上渲染,在其他函数中执行其他逻辑和处理。绘制过程是内部处理的,因此无法控制其执行频率。
但是,您可以创建单独的线程或计时器,这些线程或计时器可以以所需的频率调用进程。使用paint方法只能在画布上渲染,在另一个函数中执行其他逻辑和处理。如果没有上下文,很难诊断代码段。考虑提供一个说明你的问题的方法。这将导致更少的混乱和更好的响应在没有上下文的情况下很难诊断代码片段。考虑提供一个说明你的问题的方法。这将减少混乱和更好的响应