Java 使用自己的图形对象为我的JPanel类提供动态可运行性?

Java 使用自己的图形对象为我的JPanel类提供动态可运行性?,java,swing,runnable,Java,Swing,Runnable,好吧,听我说完。我目前的课程与下面的类似: public class GraphicsPanel extends JPanel { public void paint(Graphics g) { super.paintComponents(g); g.setColor(Color.RED); g.fillRect(100, 100, 100, 100); } } 但很明显,这不是很有用,因为它唯一能做的就是生成一个fillRect。现

好吧,听我说完。我目前的课程与下面的类似:

public class GraphicsPanel extends JPanel {

    public void paint(Graphics g) {
       super.paintComponents(g);
       g.setColor(Color.RED);
       g.fillRect(100, 100, 100, 100);
    }
}
但很明显,这不是很有用,因为它唯一能做的就是生成一个
fillRect
。现在我想做的是让父JFrame能够将自定义指令传递给它的一个窗格,这样
GraphicsPanel
的每个实例都可以做一些不同的事情。我希望能够继续将指令作为可运行项添加到对象中。我有一个总体设计:

public class GraphicsPanel extends JPanel {

private static final long serialVersionUID = 5890041512607678296L;
private java.util.List<Runnable> graphics = new ArrayList<Runnable>();

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

    for (Runnable r: graphics) {
        r.run();
    }
}

public void addGraphics(Runnable r) {
    graphics.add(r);
}

public void clearGraphics() {
    graphics.clear();
}
}
正如您所看到的,我真正想要的是能够为GraphicsPanel提供动态指令。然而,问题是:当我在父JFrame中创建Runnable时,由于明显的原因,我无法使用JPanel的graphics对象给出指令,因为我无法访问JFrame范围内的本地graphics参数
g

我很确定我想要做的是一件相当简单的事情,但似乎没有明显的途径。如果你有一个建议,涉及到放弃我目前的设计为更简单的东西,请分享它。我有时倾向于重新发明轮子,也许我完全错了。谢谢

我目前的课程与下面的类似:

public class GraphicsPanel extends JPanel {

    public void paint(Graphics g) {
       super.paintComponents(g);
       g.setColor(Color.RED);
       g.fillRect(100, 100, 100, 100);
    }
}
这不是你做定制绘画的方式

你应该:

  • 正在重写
    paintComponent(…)
    -而不是paint()

  • 然后调用
    super.paintComponent(…)
    -而不是super.paintComponent()

  • 有关更多信息和工作示例,请阅读上Swing教程的部分

    将自定义指令传递给其中一个窗格,这样GraphicsPanel的每个实例都可以执行不同的操作。我希望能够继续将指令作为可运行项添加到对象中

    您不需要添加可运行对象来进行绘制。Swing确定何时完成绘制,因此paintComponent()方法仅绘制面板的当前状态

    因此,要更改面板的状态,可以保留要绘制的对象的ArrayList。创建一个方法,将要绘制的对象添加到ArrayList中。然后在paintComponent()方法中,迭代ArrayList以绘制每个对象

    有关此方法的示例,请参见


    在本例中,由于要绘制不同的对象,因此需要将
    Shape
    对象添加到ArrayList中。<代码>形状>代码>接口支持弧、矩形、椭圆等.< /p>而不是可运行的,创建一个自己的接口,它使用一种方法来接受图形,或者只使用<代码>用户<代码>(也考虑CAMKICR答案),而不是试图访问<代码>图形<代码>上下文,而是通过“命令”。对于它可以用来生成结果的组件,我将从查看
    Shape
    sapi开始寻找灵感