如何在Java中组织图形和绘图

如何在Java中组织图形和绘图,java,swing,graphics,awt,Java,Swing,Graphics,Awt,我一直在从事Java图形编程,我觉得我理解它是如何工作的 有一件事我不喜欢/还没有作图,那就是如何管理在面板上绘制大量图形(形状、图像等) 我目前正在阅读的所有书籍/教程都已将所有需要绘制的图形放入paintcomponents/paint函数中。前, public void paint(Graphics g){ //do stuff here.... } 问题是我有太多我想画的东西,以至于把一堆代码放在一个函数中是很难看的,很难阅读,也很难管理/编辑 我懂OOP,但我对图形编程还是新

我一直在从事Java图形编程,我觉得我理解它是如何工作的

有一件事我不喜欢/还没有作图,那就是如何管理在面板上绘制大量图形(形状、图像等)

我目前正在阅读的所有书籍/教程都已将所有需要绘制的图形放入paintcomponents/paint函数中。前,

public void paint(Graphics g){
    //do stuff here....
}
问题是我有太多我想画的东西,以至于把一堆代码放在一个函数中是很难看的,很难阅读,也很难管理/编辑

我懂OOP,但我对图形编程还是新手。我应该如何管理我想要在画布上绘制的所有“数据”(确切地说是JPanel)。我目前正在调用paint(..)方法内部的函数。前,

public void paint(Graphics g){
    drawCars(g, x,y,wid,len,etc,etc);
}
然后

drawCars(Graphics g, int x, int y, int wid, etc etc){
    g.drawSomething(x,y,wid,len,)
    g.drawAnotherThing(x+90,y+60,etc, etc);
}
问题是,在我的JPanel类中,我必须管理所有这些杂散的函数

这只是为了画“一页”的东西。。我无法想象必须切换视图或游戏屏幕才能在页面上设置一大堆动画

我只是在寻找如何在java中组织由paint()方法绘制的代码的方向,这样我就不会在看我的旧作品时发疯。任何可以阅读的教程、书籍(尤其是免费的),或者好的代码都将不胜感激


到目前为止,我所发现的一切都是关于教你用graphics/graphics2D/java“能”做什么,但我正在寻找专家建议的组织/风格技巧。

把它拼凑起来,调用一种可以画出某个部分的方法。 如果你是在画房子,而不是画直线,诸如此类

drawRoof(g);
drawDoor(g);
然后在这些你有混乱的东西像drawRect


这有帮助吗?我可能误解了您要查找的内容…

将其拆分,在g中调用一个可以绘制特定部分的方法。 如果你是在画房子,而不是画直线,诸如此类

drawRoof(g);
drawDoor(g);
然后在这些你有混乱的东西像drawRect


这有帮助吗?我可能误解了你在寻找什么…

为你画的像汽车这样的符合逻辑的东西上课。每一个物体都知道它需要知道的一切,才能像自己一样绘制位置、大小和颜色。如果让所有这些对象实现一个公共接口,则可以将它们放在一个列表中。当需要绘制它们时,您迭代列表并调用每个对象的draw方法


除此之外,还需要很好地编写绘图代码,以便每个绘图语句都清楚地知道它是实际绘图的部分。

为您绘制的逻辑对象(如汽车)创建类。每一个物体都知道它需要知道的一切,才能像自己一样绘制位置、大小和颜色。如果让所有这些对象实现一个公共接口,则可以将它们放在一个列表中。当需要绘制它们时,您迭代列表并调用每个对象的draw方法



除了那份文件外,我还很好地编写了绘图代码,因此对于每个绘图语句,都可以清楚地知道它是实际绘图的部分。

这就是我目前正在做的。这只是因为当我有很多东西的时候,它就变成了很多函数,当我想做碰撞检测的时候,我没有可以快速获取数据的对象,而是我必须通过我的函数来确定它们占用了多少空间。。。等等……明白了,我认为@Eelke有这个想法,这样你就可以存储更多的信息,并且很容易访问。那个么你们的问题得到了回答,还是你们还在寻找更多的答案?我想我明白了。我没有意识到可以使用不同的类(非jpanel类)来创建形状并绘制它们。最后,在我当前的jpanel类的paint方法中实例化这个类。是的,您甚至可以添加属性,如
doesContain(x,y)
,以查看图像中是否包含点,祝您好运:)谢谢@Zeb,你不会碰巧知道关于这个主题的任何好代码/书籍/教程吧?这就是我目前正在做的。这只是因为当我有很多东西的时候,它就变成了很多函数,当我想做碰撞检测的时候,我没有可以快速获取数据的对象,而是我必须通过我的函数来确定它们占用了多少空间。。。等等……明白了,我认为@Eelke有这个想法,这样你就可以存储更多的信息,并且很容易访问。那个么你们的问题得到了回答,还是你们还在寻找更多的答案?我想我明白了。我没有意识到可以使用不同的类(非jpanel类)来创建形状并绘制它们。最后,在我当前的jpanel类的paint方法中实例化这个类。是的,您甚至可以添加属性,如
doesContain(x,y)
,以查看图像中是否包含点,祝您好运:)谢谢@Zeb,您不会碰巧知道关于这个主题的任何好代码/书籍/教程,是吗?您的说法是创建实现draw(paint())方法的类并对其进行迭代?在这种情况下,我必须获取我的Graphics/Graphics2D obj并将其传递给这些类(因此绘制方法在当前面板上绘制),然后将Graphics对象传递给draw/paint方法。要么创建一系列方法,允许您以逻辑方式复制这些层,要么按照Eelke的建议,使用类来分隔这些层。这可以归结为你设计的复杂性谢谢,这就是我希望能做到的。你有什么推荐的阅读材料吗@你的意思是让类实现一个draw(paint())方法并遍历它们吗?在这种情况下,我必须获取我的Graphics/Graphics2D obj并将其传递给这些类(因此绘制方法在当前面板上绘制),然后将Graphics对象传递给draw/paint方法。要么创建一系列方法,允许您以逻辑方式复制这些层,要么按照Eelke的建议,使用类来分隔这些层。这可以归结为您设计的复杂性谢谢,这就是我将尝试做的hopef