我有一个对象的array2d
no callable 'end' function found for type 'Album *'
我有一个方法,允许此对象在array2d中移动 现在...可以将这个数组和所有运动重新呈现在一个grapichs窗口中,例如像素吗?
喜欢这张照片:
显然,每次我调用Move方法时,像素都会移动,并且即使在窗口中,像素也必须更改位置
编辑:::::: 我使用Richard Bernard的代码
为什么所有对象都绘制在第一个框上?
答案 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();
}