gpt4 book ai didi

java - 如何使用 Swing JPanel 在 Java 中强制重绘?

转载 作者:行者123 更新时间:2023-11-29 07:53:52 27 4
gpt4 key购买 nike

为什么我的图像不会为简单的动画重新绘制?我从两种不同的方法调用 repaint() ,一种导致重绘,而另一种则不会。强制重绘的方法是从事件监听器生成的。没有的是定时动画线程。我知道动画线程运行正常,只要我不断滑动 slider ,它就会完美显示。请帮忙!
PS 是的,我在这里看到过很多类似的问题,我尝试过验证、重新验证以及使用 paint 与 paintComponent。包含代码的四个类如下:

import javax.swing.*;

public class gutz{

public static int windowWidth = 640;
public static int windowHeight = 480;

public static void main(String[] args){

hBod hb1 = new hBod(50, 30, 21, 111, 7, -11); //mass, radius, xpos, ypos, xvel, yvel
Thread t1 = new Thread(hb1);

windowmakr w = new windowmakr();
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w.setSize(windowWidth, windowHeight);
w.setVisible(true);

t1.start();
}
}

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class windowmakr extends JFrame {

private JSlider slider;
private drawr panel;

public windowmakr(){
super("Orbit Explorer");
panel = new drawr();
panel.setBackground(Color.BLACK);

slider = new JSlider(SwingConstants.HORIZONTAL, 0, 200, 10);
slider.setMajorTickSpacing(10);
slider.setPaintTicks(true);

slider.addChangeListener(
new ChangeListener(){
public void stateChanged(ChangeEvent e){
panel.setSpeed(slider.getValue());
}
}
);

add(slider, BorderLayout.SOUTH);
add(panel, BorderLayout.CENTER);

}

}

import java.awt.*;
import javax.swing.*;

public class drawr extends JPanel{

private int diameter = 10;
private static int rad;
private static int xpos;
private static int ypos;

public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.ORANGE);
g.fillOval((gutz.windowWidth-diameter)/2, ((gutz.windowHeight-diameter)/2)-40, diameter, diameter);
g.setColor(Color.CYAN);
g.fillOval(xpos, ypos, rad, rad);

}

/* public void paint(Graphics g){
super.paint(g);
g.setColor(Color.ORANGE);
g.fillOval((gutz.windowWidth-diameter)/2, ((gutz.windowHeight-diameter)/2)-40, diameter, diameter);
g.setColor(Color.CYAN);
g.fillOval(xpos, ypos, rad, rad);
}
*/
public void setSpeed(int newD){
diameter = (newD >= 0 ? newD : 10);
repaint();
}

public void renderImage(int r, int xp, int yp){
rad=r;
xpos=xp;
ypos=yp;
repaint();
}

public Dimension getPreferredSize(){
return new Dimension(200,200);
}

public Dimension getMinimumSize(){
return getPreferredSize();
}
}

public class hBod implements Runnable{

private int mass;
private int rad;
private int xpos;
private int ypos;
private double xvel;
private double yvel;

public drawr render;

public hBod(int m, int r, int xp, int yp, double xv, double yv){
mass=m;
rad=r;
xpos=xp;
ypos=yp;
xvel=xv;
yvel=yv;

render = new drawr();
}

public void run(){
try{
while(true){
xpos+=xvel;
ypos+=yvel;
yvel+=1;
System.out.printf("rad - %d, xpos - %d, ypos - %d\n", rad, xpos, ypos);
render.renderImage(rad, xpos, ypos);

Thread.sleep(1000);
}
}catch(Exception e){}
}
}

最佳答案

您可以在 JFrame 类中使用 getContentPane().repaint() 方法

关于java - 如何使用 Swing JPanel 在 Java 中强制重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19300268/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com