如果我在某个JPanel容器上绘制一个Polygon并将其放在计时器上,它将正常工作。 但是,如果我在JPanel上绘制多边形,然后尝试旋转多边形,则它不会旋转。 多边形的坐标正在改变,并且JPanel(似乎)正在重新绘制,但是它不会旋转。 这是我的意思的一些示例代码。 我知道还需要解决一些错误,但是我只关心让JPanel上的Polygon旋转。

package PolygonRotateTest;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class PolygonRotateTest {

    static ConvexPolygon polygon;
    static Timer t;
    static Model m1;
    static JPanel container;
    static JFrame frame;

    public static void main(String[] args) {
        //Small compiler issue with "no enclosing instance of type PolygonRotateTest is in scope"
        //because I lazily copy-pasted critical classes into one to make this more convenient.
        //Should still run fine if you ignore the warning.

        //ConvexPolygon makes a pentagon centered at (300,200) with a radius of 100
        polygon = new ConvexPolygon(new Coordinate(300, 200), 100, 5);

        //Model extends JPanel, accepts a polygon.
        m1 = new BallModel(polygon, Color.red);

        //Draws the polygon on the container
        container = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.fillPolygon(polygon);
            }
        };

        t = new Timer(1000 / 60, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                m1.rotate(Math.toRadians(1));
                container.repaint();
                m1.repaint();
                //Rotates the polygon 60 times per second.
                //Drawing the black polygon directly onto the container rotates correctly
                //However, the model (m1) does not redraw/rotate the red polygon
                //despite using the same polygon.

            }
        });
        t.start();

        container.setPreferredSize(new Dimension(800, 600));

        frame = new JFrame();
        frame.add(container);
        container.add(m1);

        frame.setVisible(true);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    ///Other stuff begins here///////////////
    public static abstract class ActorPolygon extends Polygon {

        private Coordinate center;

        public ActorPolygon(Coordinate center) {
            this.center = center;

        }

        public void rotate(double radianIncrement) {


            for (int i = 0; i < npoints; i++) {
                Coordinate rotate = rotatePoint(new Coordinate(xpoints[i], ypoints[i]), radianIncrement);

                xpoints[i] = rotate.getX();
                ypoints[i] = rotate.getY();

            }


        }

        public Coordinate rotatePoint(Coordinate c, double radianIncrement) {

            double xDist = c.getX() - getCenter().getX();
            double yDist = c.getY() - getCenter().getY();

            Coordinate rotated = new Coordinate(
                    (int) (0.5 + center.getX() + xDist * Math.cos(radianIncrement) - yDist * Math.sin(radianIncrement)),
                    (int) (0.5 + center.getY() + xDist * Math.sin(radianIncrement) + yDist * Math.cos(radianIncrement)));

            return rotated;
        }

        @Override
        public void translate(int dx, int dy) {
            super.translate(dx, dy);
            int x = center.getX() + dx;
            int y = center.getY() + dy;
            center = new Coordinate(x, y);
        }

        @Override
        public String toString() {
            String output = "";
            output += "Center at " + center + "\n";
            output += "contains " + npoints + " points" + "\n";
            for (int i = 0; i < npoints; i++) {
                output += i + " " + "(" + xpoints[i] + "," + ypoints[i] + ")" + "\n";
            }
            return output;
        }

        public Coordinate getCenter() {
            return center;
        }

        @Override
        public abstract ActorPolygon clone();
    }

    public static class ConvexPolygon extends ActorPolygon {

        private int radius;

        public ConvexPolygon(Coordinate center, int r, int n) {
            super(center);
            this.npoints = n;
            this.radius = r;
            xpoints = new int[npoints];
            ypoints = new int[npoints];
            double radianIncrement = 2 * Math.PI / npoints;
            double shift = Math.PI / npoints - 3 * Math.PI / 2;

            for (int i = 0; i < npoints; i++) {
                xpoints[i] = getCenter().getX() + (int) (radius * Math.cos(i * radianIncrement + shift));
                ypoints[i] = getCenter().getY() + (int) (radius * Math.sin(i * radianIncrement + shift));
            }

        }

        public int getRadius() {
            return radius;
        }

        @Override
        public ConvexPolygon clone() {
            return new ConvexPolygon(getCenter(), getRadius(), npoints);
        }
    }

    public abstract class Model extends JPanel {

        private ActorPolygon original;

        public Model(ActorPolygon polygon) {
            this.original = polygon;
            this.setPreferredSize(original.getBounds().getSize());
            Rectangle bounds = polygon.getBounds();
            this.setBounds(bounds);

        }

        public ActorPolygon getActorPolygon() {
            return original;
        }

        public void rotate(double increment) {
            original.rotate(increment);
        }

        public void drawModel(Graphics g) {

            Rectangle bounds = getActorPolygon().getBounds();
            this.setBounds(bounds);
            this.setPreferredSize(this.getBounds().getSize());
            ActorPolygon shiftedPolygon = getActorPolygon().clone();
            shiftedPolygon.translate(
                    -1 * getActorPolygon().getCenter().getX() + (int) bounds.getWidth() / 2,
                    -1 * getActorPolygon().getCenter().getY() + (int) bounds.getHeight() / 2);
            g.fillPolygon(shiftedPolygon);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            drawModel(g);
        }

        @Override
        public String toString() {
            String output = original + this.getSize().toString() + "\n" + this.getLocation() + "\n";
            return output;
        }
    }

    public static class BallModel extends Model {

        private Color color;

        public BallModel(ConvexPolygon p, Color c) {
            super(p);
            color = c;
        }

        @Override
        public void drawModel(Graphics g) {

            g.setColor(color);
            super.drawModel(g);


        }
    }

    public static class Coordinate {

        private int x;
        private int y;

        public Coordinate(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        @Override
        public String toString() {
            return "(" + x + "," + y + ")";
        }
    }
}

  ask by Mike translate from so

本文未有回复,本站智能推荐:

2回复

在半透明JPanel上绘制不同的非矩形多边形会导致边缘难看

我正在为游戏制作一个自定义菜单,并试图绘制组件时出现问题。 这个想法是,让图片或视频在后台运行,其上面有一个包含一些自定义菜单项的面板。 包含菜单项的面板应该是半透明的,这就是我猜的问题。 由于有点难以解释,我已经建立了一个展示问题的例子。 在鼠标悬停时重新绘制菜单项没有任何问题
2回复

在JPanel中绘制摆锤随时间的旋转

我试图在JPanel中描述摆臂随时间的演变。 摆具有一个固定节点,另一个节点是根据固定的一个角度和从文件中提取的一些角度计算的。 我希望每隔1秒钟就会看到摆锤以新的坐标重绘。 为了描述我的问题,我已经删除了文件和角度计算,请考虑将移动Point保存到Point ArrayList中。
1回复

Java中未显示多边形

我试图用Java制作一些形状,我创建了两个矩形,它们正常显示,但是最近我集成了多边形形状代码,但是在运行程序时却没有显示出来。 请有人帮忙! 这是运行后的屏幕截图: 这是我使用的代码: 从根本上说,我希望多边形显示为星形,但根本不出现! 谢谢..
3回复

未在JPanel中绘制图像

这是我尝试使用在屏幕上绘制的图像(图像的位置是正确的)的代码,代码运行,但没有被绘制在屏幕上。 我程序的getFile()和paintComponent()方法:
1回复

paintComponent不在整个JPanel中绘制

我正在尝试使游戏成为蛇,并遇到了问题。 我有一个叫做Segment的类,该类用于创建保存x和y位置以及蛇的方向的对象。 该类扩展了JPanel并覆盖了paintComponent()方法。 然后,将类型为Segment的对象添加到其他类的JFrame中。 我用于移动/改变蛇的方向(实际上
1回复

如何在JPanel中绘制矩形

我正在尝试在JFrame内的JPanel内绘制矩形。 我想使用paintComponents(Graphics g)方法并覆盖它,但由于某种原因,矩形未如我所愿的那样出现在JPanel中。 任何帮助,将不胜感激。 这是我的主要方法,在单独的类中:
4回复

重新绘制JScrollPane中的JPanel

我正在开发的项目是用于玩桌面游戏的计算机间实用程序,其中一个关键部分是交互式网格/地图。 我已经内置了自定义地图创建功能,并希望屏幕能够显示非常大的地图,以及非常小的地图。 为此,我创建了一系列类,我可以使用它来显示任何大小的网格。 然而,我想要做的是将完成的JPanel放入JScroll
2回复

你如何在另一个JPanel中的JPanel上绘制形状?

我目前正在尝试在JPanel上绘制形状,这是在JFrame另一个JPanel 。 我搜索了谷歌和Youtube,并找到了如何在一个有一个面板的JFrame中绘制形状,但没有找到任何可以帮助我做我正在做的事情。 (也许我没有看到什么)。 到目前为止,我见过的代码: 当我只处理
1回复

JPanel中的JPanel在不同位置被抽取两次

我正在努力在java中为新游戏创建一些自定义UI。 我现在正在创建一个窗口。 无论如何,当我创建窗口(作为JPanel )并在该窗口的顶部添加另一个主面板时,对于主要内容,主面板在两个不同的位置被绘制两次,正确的一个,并且在左上角一次。 如图所示: 中心按钮是正确的按钮,位置正确,而
1回复

在JPanel中绘制时未绘制任何内容

我正在尝试在JPanel中绘制一个矩形,但是它不会显示,但是它可以在框架中工作。 如果取消注释//frame.getContentPane().add(rect); //将绘制是否在框架中并注释frame.getContentPane()。add(panel); //但矩形不会在面板中