Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 画一个钟摆';在JPanel中s随时间的旋转_Java_Jpanel_Bufferedimage_Paintcomponent_Graphics2d - Fatal编程技术网

Java 画一个钟摆';在JPanel中s随时间的旋转

Java 画一个钟摆';在JPanel中s随时间的旋转,java,jpanel,bufferedimage,paintcomponent,graphics2d,Java,Jpanel,Bufferedimage,Paintcomponent,Graphics2d,我试图在JPanel中描述摆臂随时间的演变。 摆锤有一个固定节点,另一个节点根据固定节点和从文件中获取的一些角度计算。每1秒钟我都会看到钟摆用新的坐标重新绘制。 为了描述我的问题,我已经删除了文件和角度计算,请考虑移动点保存到一个数组的点。 我试图通过从RotateLine对象的构造函数中调用drawRotatingLine()方法来实现随时间逐渐旋转。 在drawRotatingLine()方法中,我有一个for循环: 基于ArrayList of Points的值设置移动点的坐标 引入1秒

我试图在JPanel中描述摆臂随时间的演变。 摆锤有一个固定节点,另一个节点根据固定节点和从文件中获取的一些角度计算。每1秒钟我都会看到钟摆用新的坐标重新绘制。 为了描述我的问题,我已经删除了文件和角度计算,请考虑移动点保存到一个数组的点。 我试图通过从RotateLine对象的构造函数中调用drawRotatingLine()方法来实现随时间逐渐旋转。 在drawRotatingLine()方法中,我有一个for循环:

  • 基于ArrayList of Points的值设置移动点的坐标
  • 引入1秒的睡眠时间
  • 并调用repaint()方法
问题是,我的程序只画了初始位置,然后是最后一个,中间位置没有画出来

从这里到那里,代码都是不完整的。请原谅我滥用了BuffereImage、Graphics2D,在paintComponent(…)方法中对这些对象的调用对我来说并不完全清楚,我只是需要完成程序,在我的经验的这个阶段,我在JPanels上发现了相当复杂的图画

以下是全部代码:

public class RotateLine extends JPanel {

private static final int PREF_W = 600;
private static final int PREF_H = 600;
private static final int X1 = 100;
private static final int Y1 = 100;
private BufferedImage image;
private Graphics2D bufferedGraphics;
private static ArrayList<Point> pointsList;
private static Point p;
private int counter = 0;

public RotateLine () {
    pointsList = new ArrayList<Point>();
    p = new Point(X1, Y1);
    int X2 = 400;
    int Y2 = Y1;
    for (int count = 0; count < 4; count++) {
        pointsList.add(new Point(X2, Y2));
        X2 = X2 - 100;
        Y2 = Y2 + 100;
    }
    image = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_RGB);
    bufferedGraphics = image.createGraphics();
    drawRotatingLine();
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(PREF_W, PREF_H);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    bufferedGraphics.clearRect(0, 0, PREF_W, PREF_H);
    bufferedGraphics.setColor(Color.WHITE);
    bufferedGraphics.fillRect(0, 0, PREF_W, PREF_H);
    bufferedGraphics.setColor(Color.BLACK);
    bufferedGraphics.drawLine(X1, Y1, p.x, p.y);
    g.drawImage(image, 0, 0, this);
    Toolkit.getDefaultToolkit().sync();

}

public static void main(String[] args) {
    JFrame frame = new JFrame("clock");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new RotateLine());
    frame.pack();
    frame.setVisible(true);
}

public void drawRotatingLine() {
    for (int i = 0; i < pointsList.size(); i++) {
        p.x = pointsList.get(i).x;
        p.y = pointsList.get(i).y;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Pendul.class.getName()).log(Level.SEVERE, null, ex);
        }
        repaint();
    }        
}
公共类RotateLine扩展了JPanel{
专用静态最终整型预调W=600;
专用静态最终整型参数参数H=600;
专用静态最终int X1=100;
专用静态最终int Y1=100;
私有缓冲图像;
私有图形2D缓冲图形;
私有静态ArrayList pointsList;
专用静态点p;
专用整数计数器=0;
公共旋转线(){
pointsList=新的ArrayList();
p=新点(X1,Y1);
int X2=400;
int Y2=Y1;
对于(int count=0;count<4;count++){
添加(新点(X2,Y2));
X2=X2-100;
Y2=Y2+100;
}
image=newbufferedimage(PREF_W,PREF_H,BufferedImage.TYPE_INT_RGB);
bufferedGraphics=image.createGraphics();
绘制旋转线();
}
@凌驾
公共维度getPreferredSize(){
返回新维度(PREF_W,PREF_H);
}
@凌驾
受保护组件(图形g){
超级组件(g);
clearRect(0,0,PREF_W,PREF_H);
缓冲图形。设置颜色(颜色。白色);
bufferedGraphics.fillRect(0,0,PREF_W,PREF_H);
bufferedGraphics.setColor(颜色:黑色);
缓冲图.绘制线(X1,Y1,p.x,p.y);
g、 drawImage(图像,0,0,this);
getDefaultToolkit().sync();
}
公共静态void main(字符串[]args){
JFrame=新的JFrame(“时钟”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新的旋转线());
frame.pack();
frame.setVisible(true);
}
公共void drawRotatingLine(){
对于(int i=0;i

}

您的问题很常见:您正在Swing事件线程上调用
Thread.sleep(…)
,这将使整个应用程序处于睡眠状态。相反,读取并使用摆动计时器。在Google上搜索Swing Timer教程后,在本网站上搜索
Java Swing Timer动画
,以获得如何将其用于动画的适当示例

所以

  • 让计时器的延迟为希望动画具有的任何时间片延迟,尽管我建议不要小于12毫秒
  • 在计时器的ActionListener的actionPerformed中,根据点的ArrayList值和索引设置移动点的坐标
  • 增加索引(非常重要)
  • 将索引修改为最大值
  • 呼叫重绘

您的问题很常见:您正在Swing事件线程上调用
Thread.sleep(…)
,这将使整个应用程序进入睡眠状态。相反,读取并使用摆动计时器。在Google上搜索Swing Timer教程后,在本网站上搜索
Java Swing Timer动画
,以获得如何将其用于动画的适当示例

所以

  • 让你的计时器延迟是任何你希望动画的时间片延迟,尽管我建议它不小于12毫秒
  • 在计时器的ActionListener的actionPerformed中,根据点的ArrayList值和索引设置移动点的坐标
  • 增加索引(非常重要)
  • 将索引修改为最大值
  • 呼叫重绘
根据装满鳗鱼的气垫船的回答,以下是我使用Java Swing Timer动画修改初始代码的方式:

public class RotateLine extends JPanel **implements ActionListener**{

private static final int PREF_W = 800;
private static final int PREF_H = 800;
private static final int X1 = 100;
private static final int Y1 = 100;
private static ArrayList<Point> pointsList;
private static Point p;
private int counter = 0;
private int index = 0;
**Timer time = new Timer(10, (ActionListener) this);**

public RotateLine () {
    pointsList = new ArrayList<Point>();
    p = new Point(X1, Y1);
    int X2 = 400;
    int Y2 = Y1;
    for (int count = 0; count < 300; count++) {
        pointsList.add(new Point(X2, Y2));
        X2 = X2 - 1;
        Y2 = Y2 + 2;
    }
    **time.start();**
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(PREF_W, PREF_H);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;
    drawRotatingLine(g2d);
}

public static void main(String[] args) {
    JFrame frame = new JFrame("clock");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new RotateLine());
    frame.pack();
    frame.setVisible(true);
}

public void drawRotatingLine(Graphics2D g) {
    g.drawLine(p.x, p.y, pointsList.get(index).x, pointsList.get(index).y);        
}

**public void actionPerformed(ActionEvent arg0) {
  if (index < pointsList.size() - 1){
  time.setDelay(20);
  repaint();
  index++;
  }
}**  
公共类RotateLine扩展JPanel**实现ActionListener**{
专用静态最终整型预调W=800;
专用静态最终整型参数参数H=800;
专用静态最终int X1=100;
专用静态最终int Y1=100;
私有静态ArrayList pointsList;
专用静态点p;
专用整数计数器=0;
私有整数指数=0;
**计时器时间=新计时器(10,(ActionListener)this)**
公共旋转线(){
pointsList=新的ArrayList();
p=新点(X1,Y1);
int X2=400;
int Y2=Y1;
对于(int count=0;count<300;count++){
添加(新点(X2,Y2));
X2=X2-1;
Y2=Y2+2;
}
**time.start()**
}
@凌驾
公共维度getPreferredSize(){
返回新维度(PREF_W,PREF_H);
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
绘图旋转线(g2d);
}
公共静态void main(字符串[]args){
JFrame=新的JFrame(“时钟”