Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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 如何画一个围绕画布中心在圆圈中移动的矩形?_Java_Animation - Fatal编程技术网

Java 如何画一个围绕画布中心在圆圈中移动的矩形?

Java 如何画一个围绕画布中心在圆圈中移动的矩形?,java,animation,Java,Animation,该代码旨在绘制一个矩形,该矩形绕画布中心一圈移动一次。我目前拥有的代码是 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Rectangle2D; import javax.swing.Timer; import javax.swing.JCompon

该代码旨在绘制一个矩形,该矩形绕画布中心一圈移动一次。我目前拥有的代码是

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import javax.swing.Timer;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Q3_Circular extends JComponent {

protected int degree = 0;
protected double xStart;
protected double yStart;
protected Timer timer;


public Q3_Circular() {
    timer = new Timer(1000, new TimerCallback()); //creates new times that refreshes every 100 ms, and called the TimerCallback class
    timer.start();
}

protected class TimerCallback implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        if (degree < (2 * Math.PI)){
            xStart = getWidth()/2 * Math.cos(degree+1);
            yStart = getHeight()/2 * Math.sin(degree+1);
            degree+= 1;
            repaint();
        }
        else {
            degree += 0;
            repaint();
        }

    }
}


public static void main(String[] args) {
    JFrame frame = new JFrame("AnimatedSquare");
    Q3_Circular canvas = new Q3_Circular();
    frame.add(canvas);
    frame.setSize(300, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
    frame.setVisible(true);
}   

public void paintComponent(Graphics g){
    xStart = (double)(getWidth())/2.0 * Math.cos(degree);
    yStart = (double)(getHeight())/2.0 * Math.sin(degree);

    Graphics2D g2 = (Graphics2D) g;
    g2.draw(new Rectangle2D.Double(xStart,yStart, 25,25));
    repaint();
}
}
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Rectangle2D;
导入javax.swing.Timer;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
公共类Q3_循环扩展JComponent{
保护整数度=0;
受保护的双xStart;
受保护的双星;
保护定时器;
公共问题3_通告({
timer=new timer(1000,new TimerCallback());//创建每100毫秒刷新一次的新时间,并调用TimerCallback类
timer.start();
}
受保护类TimerCallback实现ActionListener{
已执行的公共无效操作(操作事件e){
if(学位<(2*数学PI)){
xStart=getWidth()/2*Math.cos(度+1);
yStart=getHeight()/2*Math.sin(度数+1);
学位+=1;
重新油漆();
}
否则{
度+=0;
重新油漆();
}
}
}
公共静态void main(字符串[]args){
JFrame=新的JFrame(“AnimatedSquare”);
Q3_圆形画布=新的Q3_圆形();
frame.add(画布);
框架。设置尺寸(300300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}   
公共组件(图形g){
xStart=(double)(getWidth())/2.0*Math.cos(degree);
yStart=(双精度)(getHeight())/2.0*Math.sin(度);
图形2d g2=(图形2d)g;
g2.绘制(新矩形2D.Double(xStart,yStart,25,25));
重新油漆();
}
}

这段代码似乎可以非常快速地围绕点(0,0)绘制矩形。我不确定代码哪里错了。

您的代码令人困惑。这是我创建的GUI

创建Swing GUI时,请使用模型/视图/控制器模式。创建GUI模型、GUI视图以及一个或多个控制器,以修改模型并重新绘制视图

以下是我对您的代码所做的更改

  • 我创建了一个DrawingRectangle类来保存关于绘图矩形的信息。这个类是一个普通的Java对象,带有getter和setter。这个类是GUI模型

  • 除了调用SwingUtilities invokeLater方法之外,我将所有内容都移出了main方法。invokeLater方法将Swing组件的创建和使用置于。Oracle和我坚持所有Swing应用程序都从事件分派线程开始

  • 我在Q3_循环类的构造函数中创建了绘图矩形。通常,创建GUI模型,然后创建GUI视图

  • 我重新排列了run方法中的JFrame代码,使其顺序正确。我删除了setSize方法,并将其替换为pack方法。我们不在乎JFrame有多大。我们关心绘图面板有多大

  • 我从JPanel创建了一个绘图面板。在这里,我们设置绘图面板的首选大小。我们扩展了JPanel,这样就可以重写paintComponent方法

  • paintComponent方法只绘制图形矩形。在paintComponent方法中,除了绘制之外,不进行任何计算或其他操作。我添加了对super paintComponent方法的调用,以在绘制绘图矩形之前维护Swing绘制链并清除绘图面板。我使用x和y坐标作为矩形的中心,而不是左上角来绘制矩形。这是我在绘图代码中所做的一个转换

  • 我从Runnable创建了一个绘图动画。如果你愿意,你可以使用摆动计时器。我发现创建自己的动画代码更容易。这是GUI控制器。这里是我们进行计算、更新模型和重新绘制绘图面板的地方。在repaint方法中,我使用SwingUtilities invokeLater方法在事件分派线程上进行绘制。我这样做是因为动画线程是一个单独的线程

  • 这是密码。我把所有的类放在一起,这样我可以更容易地粘贴代码。你应该把这些类分成不同的文件

    package com.ggl.testing;
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.geom.Rectangle2D;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class Q3_Circular implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Q3_Circular());
        }
    
        private static final int DRAWING_WIDTH = 300;
        private static final int DRAWING_HEIGHT = DRAWING_WIDTH;
    
        private DrawingRectangle drawingRectangle;
    
        public Q3_Circular() {
            int center = DRAWING_WIDTH / 2;
            Rectangle2D rectangle = new Rectangle2D.Double(center, center, 32D, 32D);
            drawingRectangle = new DrawingRectangle(Color.RED, rectangle);
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Animated Square");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            DrawingPanel drawingPanel = new DrawingPanel(DRAWING_WIDTH,
                    DRAWING_HEIGHT, drawingRectangle);
            frame.add(drawingPanel);
    
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
    
            new Thread(new DrawingAnimation(drawingPanel, drawingRectangle))
                    .start();
        }
    
        public class DrawingPanel extends JPanel {
    
            private static final long serialVersionUID = 8226587438110549806L;
    
            private DrawingRectangle drawingRectangle;
    
            public DrawingPanel(int width, int height,
                    DrawingRectangle drawingRectangle) {
                this.setPreferredSize(new Dimension(width, height));
                this.drawingRectangle = drawingRectangle;
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                g.setColor(drawingRectangle.getColor());
    
                Rectangle2D rectangle = drawingRectangle.getRectangle();
                int x = (int) Math.round(rectangle.getX());
                int y = (int) Math.round(rectangle.getY());
                int width = (int) Math.round(rectangle.getWidth());
                int height = (int) Math.round(rectangle.getHeight());
                g.fillRect(x - width / 2, y - height / 2, width, height);
            }
    
        }
    
        public class DrawingAnimation implements Runnable {
    
            private DrawingPanel drawingPanel;
    
            private DrawingRectangle drawingRectangle;
    
            public DrawingAnimation(DrawingPanel drawingPanel,
                    DrawingRectangle drawingRectangle) {
                this.drawingPanel = drawingPanel;
                this.drawingRectangle = drawingRectangle;
            }
    
            @Override
            public void run() {
                int xCenter = drawingPanel.getWidth() / 2;
                int yCenter = drawingPanel.getHeight() / 2;
                double radius = drawingPanel.getWidth() / 3;
    
                for (int degree = 0; degree < 360; degree++) {
                    double radians = Math.toRadians((double) degree);
                    double x = radius * Math.cos(radians) + xCenter;
                    double y = radius * Math.sin(radians) + yCenter;
                    drawingRectangle.setRectangleOrigin(x, y);
                    repaint();
                    sleep(100L);
                }
            }
    
            private void sleep(long interval) {
                try {
                    Thread.sleep(interval);
                } catch (InterruptedException e) {
    
                }
            }
    
            private void repaint() {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        drawingPanel.repaint();
                    }
                });
            }
        }
    
        public class DrawingRectangle {
    
            private final Color color;
    
            private Rectangle2D rectangle;
    
            public DrawingRectangle(Color color, Rectangle2D rectangle) {
                this.color = color;
                this.rectangle = rectangle;
            }
    
            public void setRectangleOrigin(double x, double y) {
                rectangle
                        .setRect(x, y, rectangle.getWidth(), rectangle.getHeight());
            }
    
            public Color getColor() {
                return color;
            }
    
            public Rectangle2D getRectangle() {
                return rectangle;
            }
    
        }
    
    }
    
    package com.ggl.testing;
    导入java.awt.Color;
    导入java.awt.Dimension;
    导入java.awt.Graphics;
    导入java.awt.geom.Rectangle2D;
    导入javax.swing.JFrame;
    导入javax.swing.JPanel;
    导入javax.swing.SwingUtilities;
    公共类Q3\u循环实现可运行{
    公共静态void main(字符串[]args){
    invokeLater(新的Q3_循环());
    }
    专用静态最终整型图纸\u宽度=300;
    专用静态最终整型图纸高度=图纸宽度;
    私有DrawingRectangle DrawingRectangle;
    公共问题3_通告({
    int中心=图纸宽度/2;
    矩形2D矩形=新矩形2D.Double(中心,中心,32D,32D);
    drawingRectangle=新的drawingRectangle(Color.RED,rectangle);
    }
    @凌驾
    公开募捐{
    JFrame=新的JFrame(“动画正方形”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    DrawingPanel DrawingPanel=新的DrawingPanel(图纸宽度,
    绘制高度,绘制矩形);
    添加框架(drawingPanel);
    frame.pack();
    frame.setLocationByPlatform(真);
    frame.setVisible(true);
    新螺纹(新的绘图动画(绘图面板、绘图矩形))
    .start();
    }
    公共类DrawingPanel扩展了JPanel{
    私有静态最终长serialVersionUID=8226587438110549806L;
    私有DrawingRectangle DrawingRectangle;
    公共绘图面板(内部宽度、内部高度、,
    绘图矩形(绘图矩形){
    此.setPreferredSize(新尺寸(宽度、高度));
    this.drawingRectangle=drawingRectangle;
    }
    @O