java - 使用paintComponent()和继承在 "layers"中绘画

标签 java oop inheritance paintcomponent

我正在尝试创建两个组件,每个组件都有一个 paintComponent() 方法 - 目标是父对象将绘制默认艺术,然后子对象可以在其上绘制。一个例子是创建扑克牌:您有一个父 Card 类,它绘制默认卡片,然后是套件特定的类,它扩展 Card 并在其上绘制其详细信息.

这是我想要完成的任务的图表: enter image description here

这是我正在使用的代码。我的具体问题是:当绘制组件时 - 如果子类没有 paintComponent 方法 - 绘制父类的艺术作品。但是,如果我在子项上实现 paintComponent 方法,则不会绘制父项,而只会绘制子项。

这是我的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

abstract public class Tile extends JPanel {

    public static final int DEFAULT_WIDTH = 100;
    public static final int DEFAULT_HEIGHT = 100;

    @Override public void paintComponent(Graphics g){

        //Set Size
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

        Graphics2D g2 = (Graphics2D)g;

        //Draw default art


    }
    @Override public Dimension getMinimumSize()
    { return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT); }

    @Override public Dimension getPreferredSize()
    { return getMinimumSize(); }

    //.....

}
<小时/>
import javax.swing.*;
import java.awt.*;

public class CharacterTile extends Tile {

    protected char symbol;

    public CharacterTile(char symbol){
        this.symbol = symbol;
    }
    @Override public void paintComponent(Graphics g){
        super.paintComponents(g);
        Graphics2D g2 = (Graphics2D)g;
        //Draw details
    }

    //.....
}

最佳答案

这不是继承的好用。你应该有这样的东西:

Card
{
    Art front;
    Art back;
    paintComponent()
    {
        back.paintComponent();
        front.paintComponent();
    }
}

你甚至可以有一个列表层;并绘制您需要的所有图层。

子分类用于将代码拆分为更小的问题。为了重用代码,您应该使用多态性+对象组合。

关于java - 使用paintComponent()和继承在 "layers"中绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11377150/

相关文章:

c++ - C++的具体设计案例,嵌入​​式AVR项目

java - 如何命名执行对象创建和更新的类

c++ - 从接口(interface)的父接口(interface)在哪里实现功能?

java - 如何在 Spring Autowiring 属性

java - Primefaces 日历 - 未显示正确的日期

java - 通用构造器

python - 将类分配给变量

java - super(Application.class); 是什么意思?在Java中?

python - 如何在初始化时动态继承?

java - 即使满足条件,While 循环也不会终止-Java