Array2d转GUI Java Swing

时间:2019-04-25 17:41:03

标签: java swing

我有一个对象的array2d

no callable 'end' function found for type 'Album *'

我有一个方法,允许此对象在array2d中移动 现在...可以将这个数组和所有运动重新呈现在一个grapichs窗口中,例如像素吗?

喜欢这张照片:

https://i.stack.imgur.com/PU8by.jpg

显然,每次我调用Move方法时,像素都会移动,并且即使在窗口中,像素也必须更改位置

编辑::::::  我使用Richard Bernard的代码

2

为什么所有对象都绘制在第一个框上?

2 个答案:

答案 0 :(得分:0)

这确实是可能的,但是我不确定(我认为这不可能)更新相同的窗口。而是每次您运行一个新窗口都会打开。为此,您将需要某些库,例如Jung或JgraphT。

这是我的链接,a working Jung tutorial 这是一个到我JgraphT tutorial

的链接

看看这些,您将需要安装一些软件包和库来使用它们,还需要将一些Jar文件添加到项目库中。这有点棘手,但肯定是可行的。{{3 }} 祝你好运,希望它也对你有用

答案 1 :(得分:0)

向Person类添加draw(Graphics g)方法,该方法将使用AWT图形绘制Person实例的表示形式。

public void draw(Graphics g, int cellWidth, int cellHeight) {
  /*
  do your drawing here, look into
  AWT Graphics for examples on how
  to draw.
  */
}

创建一个JFrame,添加一个JPanel,重写JPanel的paintComponent()方法,该方法绘制一个表示2d数组的网格,然后使此方法遍历矩阵中的所有Person,并调用每个人的draw方法。

    // essentially the "frame" around the 
    // new window you will draw the GUI inside of
    JFrame frame = new JFrame();
    int width = 400, height = 400;
    frame.setSize(width + 40, height + 60);

    int cellWidth = width / cols;
    int cellHeight = height / rows;

    // The panel, which is the surface you will draw on
    JPanel panel = new JPanel() {
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.translate(15, 10);
            g.setColor(Color.black);
            // drawing universo
            // drawing vertical lines (column borders)
            for(int i = 0; i <= cols; i++) {
                int dx = (int)(i * width / (double)cols);
                g.drawLine(dx, 0, dx, height);
            }
            // drawing horizontal lines (row borders)
            for(int i = 0; i <= rows; i++) {
                int dy = (int)(i * height / (double)rows);
                g.drawLine(0, dy, width, dy);
            }
            // draw all your Person objects
            for(int i = 0; i < rows; i++) {
                for(int j = 0; j < cols; j++) {
                    // optionally pass cellWidth and cellHeight to help
                    // draw the Person object in the correct cell.
                    if(universo[i][j] != null) {
                        universo[i][j].draw(g, cellWidth, cellHeight);
                    }
                }
            }
        }
    };

    // Place the panel inside of the frame
    frame.add(panel);

    // make the frame and its contents visible on the screen
    frame.setVisible(true);

现在,根据对您的Person对象调用move()的频率,我将以不同的方式重新绘制JPanel。

如果它很少出现,则可以使用moveAndRepaint(Person p)方法,该方法本质上会调用p.move(),然后在JFrame的JPanel实例上进行repaint()。

public void moveAndRepaint(Person person, JPanel panel) {
    person.move();
    panel.repaint();
}

如果非常频繁,则可以在矩阵中的所有Person实例上调用move,然后在JPanel上调用repaint()。

public void moveAllAndRepaint(Person[][] universo, JPanel panel) {

    // call move on all Person objects in the universo
    for(int j = 0; j < universo.length; j++) {
        for(int i = 0; i < universo[j].length; i++) {
            if(universo[i][j] != null) {
                universo[i][j].move();
            }
        }
    }

    // redraws everything in the panel to reflect changes in the
    // Person objects
    panel.repaint();
}