1

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

这是我想要完成的图表: 在此处输入图像描述

这是我正在使用的代码。我的具体问题是:绘制组件时——如果子类没有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
    }

    //.....
}
4

1 回答 1

0

这不是很好地使用继承。你应该有类似的东西:

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

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

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

于 2012-07-07T17:58:06.640 回答