Java 如何创建一个自定义图形类供paintComponent使用?
我一直在四处寻找,想更好地了解我想做什么,但运气不好。我想答案比我想象的要简单得多 我正在为一个班级项目制作一个棋盘游戏,并使用JPanel来显示图形(显然)。在paintComponent中,我不想只在一个位置创建所有东西,而是想将我的图形外部化为一个类,我可以在paintComponent中简单地实例化它。尽可能保持所有东西在逻辑上分离和干净 我的Graphics2D看起来需要一个为其.add()方法实现Shape的类。如果这是正确的,那么,假设我实现了形状,当它绘制我的形状时,paintComponent在寻找什么?我是否需要任何特定的方法,或者仅仅使用构造函数?或者,我的所有图形类都应该只使用JPanel和自己的paintComponent吗?这让我觉得有点记忆犹新,而且不对 到目前为止,我看到的所有例子都是一样的Java 如何创建一个自定义图形类供paintComponent使用?,java,swing,graphics,awt,paintcomponent,Java,Swing,Graphics,Awt,Paintcomponent,我一直在四处寻找,想更好地了解我想做什么,但运气不好。我想答案比我想象的要简单得多 我正在为一个班级项目制作一个棋盘游戏,并使用JPanel来显示图形(显然)。在paintComponent中,我不想只在一个位置创建所有东西,而是想将我的图形外部化为一个类,我可以在paintComponent中简单地实例化它。尽可能保持所有东西在逻辑上分离和干净 我的Graphics2D看起来需要一个为其.add()方法实现Shape的类。如果这是正确的,那么,假设我实现了形状,当它绘制我的形状时,paintC
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// Create shapes here which combine to form
// a larger object...
g2.add(a circle...);
g2.add(a rectangle...);
g2.add(other shapes...);
}
我真正想做的是
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// Intantiate robust graphics object from external class.
g2.add(graphicsObject);
}
所以我最终只需要按顺序添加项目,一个游戏板表面层,上面的瓷砖,然后在瓷砖中放置游戏令牌
智慧的话语和优秀的链接是最受欢迎的。提前感谢。绘画方法仅适用于绘画。它应该绘制类的属性。在这种情况下,属性将是要绘制的形状。因此,类需要一个方法来指定要绘制的形状。您不希望在绘制方法中创建形状 您想:
paintComponent()
方法中,您只需迭代列表并绘制每个形状// Create List containing Shapes to be painted
List<Shape> shapes = new ArrayList<Shape>();
shapes.add( circle ):
shapes.add( rectangle );
// The custom painting code might look like:
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g.create();
for (Shape info : shapes)
{
g2d.fill( info.getShape() );
}
g2d.dispose();
}
//创建包含要绘制的形状的列表
列表形状=新建ArrayList();
形状。添加(圆形):
添加(矩形);
//自定义绘制代码可能如下所示:
受保护组件(图形g)
{
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
用于(形状信息:形状)
{
g2d.fill(info.getShape());
}
g2d.dispose();
}
因此,类还可能有一个addShape(…)
方法来更新形状列表
有关此方法的工作示例,请查看中的
DrawOnComponent
示例。此示例仅绘制矩形,但演示了绘制方法。绘制方法仅用于绘制。它应该绘制类的属性。在这种情况下,属性将是要绘制的形状。因此,类需要一个方法来指定要绘制的形状。您不希望在绘制方法中创建形状
您想:
paintComponent()
方法中,您只需迭代列表并绘制每个形状// Create List containing Shapes to be painted
List<Shape> shapes = new ArrayList<Shape>();
shapes.add( circle ):
shapes.add( rectangle );
// The custom painting code might look like:
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g.create();
for (Shape info : shapes)
{
g2d.fill( info.getShape() );
}
g2d.dispose();
}
//创建包含要绘制的形状的列表
列表形状=新建ArrayList();
形状。添加(圆形):
添加(矩形);
//自定义绘制代码可能如下所示:
受保护组件(图形g)
{
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
用于(形状信息:形状)
{
g2d.fill(info.getShape());
}
g2d.dispose();
}
因此,类还可能有一个addShape(…)
方法来更新形状列表
有关此方法的工作示例,请查看中的
DrawOnComponent
示例。这个例子只画矩形,但它展示了绘画的方法。我确实想过用列表做类似的事情。我希望JComponent或某些接口能够为我提供这种级别的功能,但从我所看到的任何地方来看,似乎都不是这样。图形编程是我对still有点陌生的东西,所以我想我应该质疑我的方法是否适合开始。考虑到我还没有找到一个这样的实现,这让我有点怀疑我的逻辑。@ScotMatson我希望JComponent或某个接口能为我提供这种级别的功能
——这个例子使用了Shape接口。您可以轻松创建自己的接口,该接口定义要为自定义对象调用的绘制方法。这里发布的代码基本上就是做你想做的事情所需要的所有代码。我不知道你在质疑你的逻辑的哪一部分。你需要一个数据结构来存储要绘制的对象,一个方法来将对象添加到该数据结构中,并需要绘制代码来绘制每个对象。我希望JComponent或某些接口能够为我提供这种级别的功能,但从我所看到的任何地方来看,似乎都不是这样。图形编程是我对still有点陌生的东西,所以我想我应该质疑我的方法是否适合开始。考虑到我还没有找到一个这样的实现,这让我有点怀疑我的逻辑。@ScotMatson我希望JComponent或某个接口能为我提供这种级别的功能
——这个例子使用了Shape接口。您可以轻松创建自己的接口,该接口定义要为自定义对象调用的绘制方法。这里发布的代码基本上就是做你想做的事情所需要的所有代码。我不知道你在质疑你的逻辑的哪一部分。您需要一个数据结构来存储要绘制的对象,需要一个方法来将对象添加到该数据结构中,需要一个绘制代码来绘制每个对象。