【问题标题】:Java View following a moving object in swingJava View 跟随摆动中的移动对象
【发布时间】:2015-09-18 17:13:11
【问题描述】:

我目前在 JFrame 中有一个 JPanel,我需要视图来跟随一个对象,我无法移动世界的原因是因为该对象正在围绕另一个对象运行,所以要弄清楚如何移动世界会多一点困难。

【问题讨论】:

  • 我用什么?我试过 JScrollPane 和 JViewport 但我不太了解它们。
  • 您不需要 JViewPort,此解决方案仅适用于 JPanel 和上面的图形。
  • 你达到你想要的了吗?如果没有,您希望我发布一个示例吗?
  • 我从来没有得到我想要的效果。我会解释我试图做什么,你可以告诉我它是否可能。我有一个物体被变压器旋转,同时被偏移,所以它绕着另一个物体运行。我希望无论物体在哪里,视图都能放大到物体,并在它绕行时跟随它。

标签: java swing view jframe jpanel


【解决方案1】:

好的,下面是有关如何执行此操作的示例。请注意,SSCCE 不需要是 OO,因此您可能不应该将其复制并粘贴到您当前的项目中。我不会解释这些步骤,因为几乎所有内容都在我发布的链接中进行了解释。不过,这里是参考 for the 2D camerafor the object moving in circular path

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import javax.swing.Timer;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }

    public Example() {

        JFrame frame = new JFrame();

        frame.setContentPane(new DrawingPanel());

        frame.setSize(400, 300);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);

    }

    class DrawingPanel extends JPanel {

        int angle = 0;
        int rotation = 0;
        int radius = 150;

        int ovalX = 150;
        int ovalY = 150;
        int ovalWidth = 100;
        int ovalHeight = 100;
        int ovalCenterX = ovalX + ovalWidth / 2;
        int ovalCenterY = ovalY + ovalHeight / 2;

        int recX;
        int recY;
        int recWidth = 50;
        int recHeight = 50;
        int recCenterX;
        int recCenterY;

        int WORLD_SIZE_X = 6000;
        int WORLD_SIZE_Y = 6000;

        int camX;
        int camY;

        public DrawingPanel() {

            ActionListener al = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    angle++;
                    rotation++;
                    recCenterX = (int) ((int) ovalCenterX + Math.sin(Math.toRadians(angle)) * radius);
                    recCenterY = (int) ((int) ovalCenterY + Math.cos(Math.toRadians(angle)) * radius);
                    recX = recCenterX - recWidth / 2;
                    recY = recCenterY - recHeight / 2;
                    repaint();
                }
            };

            Timer timer = new Timer(15, al);
            timer.start();

        }

        @Override
        public void paintComponent(Graphics g) {

            super.paintComponent(g);
            Graphics2D gg = (Graphics2D) g;
            gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            int VIEWPORT_SIZE_X = getWidth();
            int VIEWPORT_SIZE_Y = getHeight();

            int offsetMaxX = WORLD_SIZE_X - VIEWPORT_SIZE_X;
            int offsetMaxY = WORLD_SIZE_Y - VIEWPORT_SIZE_Y;

            camX = recCenterX - VIEWPORT_SIZE_X / 2;
            camY = recCenterY - VIEWPORT_SIZE_Y / 2;

            if (camX > offsetMaxX) {
                camX = offsetMaxX;
            }

            if (camY > offsetMaxY) {
                camY = offsetMaxY;
            }

            gg.translate(-camX, -camY);

            gg.setColor(Color.BLUE);
            gg.fillOval(ovalX, ovalY, ovalWidth, ovalHeight);

            AffineTransform old = gg.getTransform();

            gg.rotate(Math.toRadians(rotation), recCenterX, recCenterY);
            gg.setColor(Color.RED);
            gg.drawRect(recX, recY, recWidth, recHeight);

            gg.setTransform(old);

            gg.setColor(Color.GREEN);
            gg.drawLine(ovalCenterX, ovalCenterY, recCenterX, recCenterY);

        }

    }

}

【讨论】:

  • 我将您的代码复制到 Eclipse 中,但是视图保持在屏幕中间而不是环绕的蓝色圆圈。我的参考资料可以解决吗?如果是这样,谢谢,我马上就可以了。
  • @TomHaffenden 好吧,红色方块是在绕行+旋转,而不是蓝色圆圈-相机跟随红色方块。
  • 那么...这真的解决了这个问题吗?如果是,请考虑accept这个答案。 :) 很高兴它有帮助!
  • 是的,谢谢。忘记了接受的事情,因为它不会让我在 2 天后。无论如何,我还有一个问题是将使用 actionListnener 的 JFrame 放在可运行方法中的目的是什么?
  • 非常感谢,您已经回答了我所有的问题以及更多问题^^
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多