为什么我的图像不能重绘为简单的动画?我从两个不同的方法调用repaint(),一个导致重绘,但另一个不导致重绘。强制重绘的方法由事件侦听器生成。那个不是定时的动画线程。我知道动画线程正常运行,只要我连续滑动滑块,它就会完美显示。请帮助!
PS是的,我在这里看到很多类似的问题,我试过验证,重新验证和使用paint和paintComponent。四个班组成的代码如下:如何强制使用Swing JPanel在Java中进行重绘?
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){}
}
}
你有没有打过电话了'repaint'调用(从动画线程)使用'SwingUtilities.invokeLater'因为Swing/AWT是_not_线程安全的? – Neet
为了更好地提供帮助,请提供一个[SSCCE](http://sscce.org) –
即使我找不到重复,这个问题已经回答了好几次:[Here](http:/ /stackoverflow.com/questions/15412260/clever-asynchronous-repaint-in-java)和[这里](http://stackoverflow.com/questions/19061351/repainting-a-jpanel-with-data-from-another- (http://stackoverflow.com/search?page=1&tab=relevance&q= [java]%20repaint%20 from%20another%20read) –