从子类java访问JFrame类

时间:2016-03-17 22:31:38

标签: java swing user-interface

public SubClass extends SuperClass
{
}

例如像这样的类我将如何访问JPanel方法

public void paintComponent(Graphics g)   {
 }

在subClass中做一些动画,因为java不支持多重继承,我试图寻找相当于JPanel的接口,但我找不到一个

例如

   public class Animal{
   ...some code
   }


  public class Dog extends Animal {
        // in this class i want to use the PaintComponent method 
          public void paintComponent(Graphics g)   {

        }
  }

2 个答案:

答案 0 :(得分:2)

听起来好像你正在使用继承不正确,因为你问的问题不是通过继承解决,而是通过组合解决。例如,一个类改变另一个类的状态的一种方法是让第一个类保存对第二个类的引用,并让它调用第二个类的方法,这可能是你需要做的。解决方案的详细信息取决于问题和代码的详细信息。

你说:

  

我想要做的是在我自己的个人子类中使用paintCompontent方法(),但由于个人子类已被扩展,我无法使用JPanel扩展子类

您应该在JPanel的paintComponent期间内完成所有绘图,而JPanel是 view 程序可视化部分的一部分。但绘制的内容可能取决于其他类的状态,特别是模型,或者处理程序逻辑的程序类。我建议您将您的关注点与M-V-C(模型 - 视图 - 控制器)模式分开,以便您可以按照自己的意愿进行操作 - 允许模型中的状态更改反映在视图中。

同样,要获得更详细的答案,您需要提供有关问题和代码的更多详细信息。

对于使用代码的非常(过于简单)的示例:

// no need to extend JPanel....
public class Dog extends Animal {
    // give Dog a drawing method
    public void draw(Graphics2D g2) {
        // .... some code to draw
    }
}

public class DrawingPanel extends JPanel {
    private Dog dog; // hold Dog reference

    // allow passage of current Dog into class
    public DrawingPanel(Dog dog) {
        this.dog = dog;
    }

    @Override
    protected void paintComponent(g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        dog.draw(g2);  // draw Dog's picture
    }
}

别处:

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        Dog myDog = new Dog();
        DrawingPanel drawingPanel = new DrawingPanel(myDog);

        JFrame myFrame = new JFrame("Dog Frame");
        myFrame.add(drawingPanel);

        //..... etc...

        myFrame.setVisible(true);
    });
}    

答案 1 :(得分:1)

  

我想要做的是在我自己的个人子类中使用paintCompontent方法(),但由于个人子类已被扩展,我无法使用JPanel扩展子类

如果是这种情况,您可能需要再次查看您的设计。至少有两种方式:

使用合成而不是继承:

class Subclass extends JPanel     //or extends to other component of your interest
{
    private MySuperClass obj;
}

而不是扩展到MySuperClass,看看是否可以使它成为子类的属性。 (这当然取决于MySuperClass是什么)。

让您的SuperClass成为一个组件:

class MySuperClass extends JPanel    //or extends to other component of your interest
{
    //Your attributes and behaviours
}

class MySubClass extends MySuperClass
{
    //Your attributes and behaviours
}

这当然也取决于你Superclass的内容。直到我们确切知道你的超级课程是什么。这是两种可能的方式。

添加:

根据您添加的代码,无需将要绘制的类扩展为Component。您可以编写自己的draw(g)方法。例如: Animating Cars