【问题标题】:How to create a cube in swing?如何在摇摆中创建一个立方体?
【发布时间】:2014-03-21 03:42:00
【问题描述】:

我正在尝试创建一个在被JPanel 调用时创建一个多维数据集的类。不过,我所看到的是一种称为ColorCube 的东西,它需要某种“Universe”和一个Canvas,尽管我没有发现这种方法兼容JPanel

澄清一下,我不是在问如何创建自定义JComponent(确切地说),我也不是在问如何添加颜色或旋转它,只是如何创建一个在被JPanel 调用时呈现一个立方体到屏幕上。

【问题讨论】:

  • 您是否在问如何创建一个自定义 JComponent 来显示立方体的 3D 绘图,用户可以在其中更改立方体的颜色?
  • 您想要一个可以旋转的 3D 立方体等?
  • 图片有助于传达您想要实现的目标
  • 我编辑了帖子以澄清
  • 我不确定编辑是否更清晰:/

标签: java swing graphics jpanel cube


【解决方案1】:

您真正需要的只是将x, y, and size 传递给Cube 类,然后

  • 采用这些参数并为第一个正方形构建一个角点数组,并为第二个移位正方形构建一个角点。请参阅 Cube 类中的方法 getCubeOnePointsgetCubeTwoPoints 方法。

  • 画出第一个正方形。绘制第二个正方形,并连接点数组中的点。请参阅Cube 类中的drawCube 方法。

  • 创建Cube 类的实例并传递必要的参数,然后绘制立方体。见CubePanel构造函数和paintComponent方法

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class CubePanel extends JPanel{
    private static final int D_W = 400;
    private static final int D_H = 400;

    Cube cube;
    public CubePanel() {
        cube = new Cube(75, 75, 200, 50);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        cube.drawCube(g);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(D_W, D_H);
    }

    public class Cube {
        int x, y, size, shift;
        Point[] cubeOnePoints;
        Point[] cubeTwoPoints;
        public Cube(int x, int y, int size, int shift) {
            this.x = x;
            this.y = y;
            this.size = size;
            this.shift = shift;
            cubeOnePoints = getCubeOnePoints();
            cubeTwoPoints = getCubeTwoPoints();
        }

        private Point[] getCubeOnePoints() {
            Point[] points = new Point[4];
            points[0] = new Point(x, y);
            points[1] = new Point(x + size, y);
            points[2] = new Point(x + size, y + size);
            points[3] = new Point(x, y + size);
            return points;
        }

        private Point[] getCubeTwoPoints() {
            int newX = x + shift;
            int newY = y + shift;
            Point[] points = new Point[4];
            points[0] = new Point(newX, newY);
            points[1] = new Point(newX + size, newY);
            points[2] = new Point(newX + size, newY + size);
            points[3] = new Point(newX, newY + size);
            return points;
        }

        public void drawCube(Graphics g) {
            g.drawRect(x, y, size, size);
            g.drawRect(x + shift, y + shift, size, size);
            // draw connecting lines
            for (int i = 0; i < 4; i++) {
                g.drawLine(cubeOnePoints[i].x, cubeOnePoints[i].y, 
                        cubeTwoPoints[i].x, cubeTwoPoints[i].y);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new CubePanel());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

更新

“如果我想要一个 3d 中的这个立方体可以四处走动怎么办”

只需创建方法来转移所有xs 或ys 并调用它,然后重新绘制。该方法可能类似于

    public void shiftLeft() {
        x -= SHIFT_INC;
        for (Point p : cubeOnePoints) {
            p.x -= SHIFT_INC;
        }
        for (Point p : cubeTwoPoints) {
            p.x -= SHIFT_INC;
        }
    }

在下面的示例中,我只是在与 键的键绑定中调用它。

    im.put(KeyStroke.getKeyStroke("LEFT"), "shiftLeft");
    getActionMap().put("shiftLeft", new AbstractAction(){
        public void actionPerformed(ActionEvent e) {
            cube.shiftLeft();
            repaint();
        }
    });

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class CubePanel extends JPanel{
    private static final int D_W = 400;
    private static final int D_H = 300;

    Cube cube;
    public CubePanel() {
        cube = new Cube(75, 75, 50, 15);
        InputMap im = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        im.put(KeyStroke.getKeyStroke("RIGHT"), "shiftRight");
        getActionMap().put("shiftRight", new AbstractAction(){
            public void actionPerformed(ActionEvent e) {
                cube.shiftRight();
                repaint();
            }
        });
        im.put(KeyStroke.getKeyStroke("LEFT"), "shiftLeft");
        getActionMap().put("shiftLeft", new AbstractAction(){
            public void actionPerformed(ActionEvent e) {
                cube.shiftLeft();
                repaint();
            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        cube.drawCube(g);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(D_W, D_H);
    }

    public class Cube {
        private static final int SHIFT_INC = 5;
        int x, y, size, shift;
        Point[] cubeOnePoints;
        Point[] cubeTwoPoints;
        public Cube(int x, int y, int size, int shift) {
            this.x = x;
            this.y = y;
            this.size = size;
            this.shift = shift;
            cubeOnePoints = getCubeOnePoints();
            cubeTwoPoints = getCubeTwoPoints();
        }

        private Point[] getCubeOnePoints() {
            Point[] points = new Point[4];
            points[0] = new Point(x, y);
            points[1] = new Point(x + size, y);
            points[2] = new Point(x + size, y + size);
            points[3] = new Point(x, y + size);
            return points;
        }

        private Point[] getCubeTwoPoints() {
            int newX = x + shift;
            int newY = y + shift;
            Point[] points = new Point[4];
            points[0] = new Point(newX, newY);
            points[1] = new Point(newX + size, newY);
            points[2] = new Point(newX + size, newY + size);
            points[3] = new Point(newX, newY + size);
            return points;
        }

        public void shiftLeft() {
            x -= SHIFT_INC;
            for (Point p : cubeOnePoints) {
                p.x -= SHIFT_INC;
            }
            for (Point p : cubeTwoPoints) {
                p.x -= SHIFT_INC;
            }
        }

        public void shiftRight() {
            x += SHIFT_INC;
            for (Point p : cubeOnePoints) {
                p.x += SHIFT_INC;
            }
            for (Point p : cubeTwoPoints) {
                p.x += SHIFT_INC;
            }
        }

        public void drawCube(Graphics g) {
            g.drawRect(x, y, size, size);
            g.drawRect(x + shift, y + shift, size, size);
            // draw connecting lines
            for (int i = 0; i < 4; i++) {
                g.drawLine(cubeOnePoints[i].x, cubeOnePoints[i].y, 
                        cubeTwoPoints[i].x, cubeTwoPoints[i].y);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new CubePanel());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

【讨论】:

  • 一个问题,如果我想要一个 3d 中的这个立方体可以四处走动怎么办
  • Cube 类中创建一个shift 方法,它将所有 x 点或y 点移动一定的增量,然后调用repaint。
  • 例如查看我的 UPDATE
  • 好吧,这很接近,当我说这个时不要误会我的意思,当我说走来走去时,我的意思是像我的世界。你可以停下来对我说自己做。
  • 对不起,我不知道我的世界。我不是真正的游戏玩家。
【解决方案2】:
package Box;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ComponentListener;
import java.awt.event.ComponentEvent;
public class Box2 extends JPanel
{

    public Box2() 
    {
        this.addComponentListener(new ComponentListener(){
        public void componentShown(ComponentEvent arg0) {
            // TODO Auto-generated method stub

        }

        public void componentResized(ComponentEvent arg0) {
            paintComponent(getGraphics());

        }

        public void componentMoved(ComponentEvent arg0) {
            // TODO Auto-generated method stub

        }

        public void componentHidden(ComponentEvent arg0) {
            // TODO Auto-generated method stub

        }
        });

    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        this.setBackground(Color.white);


        Dimension d;
        d=getSize();
        int height, width;
        height =d.height;
        width=d.width;
        int w,h;
        javax.swing.border.Border linebor =BorderFactory.createLineBorder(new Color(0xAD85FF),6 );

        g.drawRect(0,0, w=width/2, h=height/2);

        g.drawRect(w/2,h/2,w/2*2,h/2*2);

        g.drawLine(0,0,w/2,h/2);

        g.drawLine(w,h,w/2+w/2*2,h/2+h/2*2);

        g.drawLine(w,0,w/2+w/2*2,h/2);  

        g.drawLine(0,h,w/2,h/2+h/2*2);  
        //g.drawLine(0, height – borderControl, width, height – borderControl);
    }
}

现在为主文件创建另一个类

package Box;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Box2_main extends JPanel
{


    public static void main(String[] args)
    {
        Box2 cube = new Box2();
        JFrame frame = new JFrame("Cube2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(cube);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }

}

如果你改变窗口的尺寸,那么立方体的大小也会增加/减少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多