【问题标题】:How to Retrieve a Graphics Object From a Linked List in Java and Display it in a JFrame如何从 Java 中的链表中检索图形对象并将其显示在 JFrame 中
【发布时间】:2013-12-04 08:18:44
【问题描述】:

如果这里已经有一个线程处理这个问题,请原谅我,但我似乎找不到一个处理我的特定任务的线程。

我是 Java 新手,在我生命中的不同阶段只使用 BASIC 和 Z80 汇编进行过编码。我正在慢慢掌握它,但我正在努力完成我正在学习的课程中的一项任务。

我需要创建一些基本的Graphics,圆形,正方形等等,然后我需要将它们作为对象存储在一个链表中。我已经设法轻松地绘制对象并将它们存储在链接列表中,但我无法弄清楚如何创建一个方法,然后将存储在列表中的内容并将它们绘制在 JFrame 中。

这是我的代码: 公共类 Shape 扩展 JFrame {

public void paint(Graphics g){
LinkedList<Object> ll = new LinkedList<Object>();
setSize(800,600);
setDefaultCloseOperation(EXIT_ON_CLOSE);

Circle c = new Circle();
c.setHeight(100);
c.setWidth(100);
c.setXpos(100);
c.setYpos(250);

ll.add(c);

Square s = new Square();
s.setHeight(100);
s.setWidth(100);
s.setXpos(300);
s.setYpos(250);

ll.add(s);

Bar b = new Bar();
b.setHeight(100);
b.setWidth(200);
b.setXpos(500);
b.setYpos(250);

ll.add(b);

}

以及 Circle 类中的代码示例(正方形等几乎相同)

public class Circle {
private int xpos;
private int ypos;
private int width;
private int height;




public void paint(Graphics g) {

   g.setColor(Color.RED);
   g.fillOval(xpos, ypos, width, height);
    }

public void setXpos(int xpos) {
    this.xpos = xpos;
}

public void setYpos(int ypos) {
    this.ypos = ypos;
}

public void setWidth(int width) {
    this.width = width;
}

public void setHeight(int height) {
    this.height = height;
}

基本上,我对如何将 LinkedList 中包含的内容获取到 JFrame 有一个完全的心理障碍。

非常感谢任何帮助!

【问题讨论】:

  • paint 不是更改框架或组件状态或构建您要执行的各种其他元素的地方,而是应该在调用 paint 和 @987654327 之前设置这些元素@ 应该简单地呈现这个状态。您还应该避免覆盖paint,而是创建一个自定义类,从JPanel 之类的东西扩展并覆盖它的paintComponent 方法。更多详情请关注Performing Custom Painting
  • This example 在概念上是相似的,因为它有一个 ListShapes 来绘制,它从 List 绘制它们(列表单独更新)

标签: java graphics


【解决方案1】:

你的paint方法没有做它应该做的事情:在Graphics实例上绘制你的对象。相反,您只是将对象添加到列表中。最有可能的是,这些对象应该在其他时间包含在列表中,甚至可能包含在构造函数中。此外,如果您打算以通用方式使用 Circle、Bar 等对象,则应使它们的类继承自某个通用接口。例如:

   interface Painter {
      public void paint(Graphics g);
   }

然后:

public class Shape extends Painter {...}

在这种情况下,您可以拥有一个 List 类型的类成员,其中包含您现在添加到局部变量 ll 中的内容。

那么,您的 paint 方法可能类似于:

public void paint(Graphics g){
   super.paint(g);

   for (Painter p : painters) {
       p.paint(g);
   }
};

希望这会有所帮助。

【讨论】:

  • 感谢 coderazzi!你的回复肯定让我有了更多的了解!最终,在处理我设定的任务时,我将不得不处理继承问题,所以你的帖子肯定对我有帮助!暂时我主要关心的是从列表中取回“形状”然后我有点脑波并添加了这段代码...... Circle retrieveC; retrieveC = (Circle) ll.get(0);检索C.paint(g);如果有人有任何提示,那就太好了!这一切都有助于我学习!
猜你喜欢
  • 2018-08-06
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多