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视图以及一个或多个控制器,以修改模型并重新绘制视图 以下是我对您的代码所做的更改
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