Java - 使用paintComponent和Polymorphism绘制形状

时间:2017-11-11 22:23:35

标签: java swing polymorphism paintcomponent

我有一项任务,我必须在同一个面板上绘制6个形状。 我尝试了几件事,但我找不到在同一个面板上绘制形状的方法,但仅限于不同的面板。

我有Shapes的课程:

public abstract class MyShape extends JPanel
public abstract class MyBoundedShape extends MyShape
public class MyOval extends MyBoundedShape
public class MyRectangle extends MyBoundedShape
public class MyLine  extends MyShape

在这些类中我没有编写paintComponent方法,但是我已经在一个diffreent类中编写了它,它接收一个Shapes数组作为属性:

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;

public class DrawingShapes extends JPanel implements Cloneable{
    private  ArrayList<MyShape> Shapes;
    public DrawingShapes(ArrayList<MyShape> Shapes){
        this.Shapes=Shapes;
        initilizePaintComponent(); //draws a frame for the paintComponent
    }


    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);

        for (int i = 0; i <Shapes.size(); i++) {
            g.setColor(Shapes.get(i).get_color());
            if (Shapes.get(i) instanceof MyRectangle){
                if (((MyRectangle) Shapes.get(i)).get_isFilled()){
                    g.fillRect(Shapes.get(i).get_x1(),Shapes.get(i).get_y1(),
                            Shapes.get(i).get_width(),Shapes.get(i).get_height());
                }
                else
                    g.drawRect(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(),
                            Shapes.get(i).get_width(), Shapes.get(i).get_height());
            }
            if (Shapes.get(i) instanceof MyOval){
                if (((MyRectangle) Shapes.get(i)).get_isFilled()){
                    g.fillOval(Shapes.get(i).get_x1(),Shapes.get(i).get_y1(),
                            Shapes.get(i).get_width(),Shapes.get(i).get_height());
                }
                else
                    g.drawOval(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(),
                            Shapes.get(i).get_width(), Shapes.get(i).get_height());

            }
            else
                g.drawLine(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(),
                        Shapes.get(i).get_width(), Shapes.get(i).get_height());

        }

    }
    public void initilizePaintComponent(){
        JFrame frame = new JFrame("Shapes");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400,400);
        for (int i = 0; i < Shapes.size(); i++) {
            frame.add(Shapes.get(i));
            frame.setVisible(true);

        }

    }

}

我的问题是paintComponent方法不起作用 - 程序不会绘制单个形状

运行程序后,我得到一个名为&#34; Shape&#34;的空框架。 - 框架可以正常工作,但没有形状。

为什么paintComponent没有工作?

谢谢!

1 个答案:

答案 0 :(得分:2)

此:

public void initilizePaintComponent(){
    JFrame frame = new JFrame("Shapes");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400,400);
    for (int i = 0; i < Shapes.size(); i++) {
        frame.add(Shapes.get(i));
        frame.setVisible(true);
    }
}

忽略JFrame(以及所有顶级窗口)默认使用的布局管理器BorderLayout。虽然您可能会将Shapes.size()组件添加到JFrame,但只有最后一个组件可见,因为通过以默认方式添加它们,BorderLayout将覆盖所有先前添加的组件,并添加最后添加的组件。

可能的解决方案:

  • 仅使用一个绘制JPanel并覆盖其paintComponent方法。
  • 仅将此单个绘图JPanel添加到JFrame的BorderLayout.CENTER(默认位置)
  • 使您的MyShape类成为非GUI非组件逻辑类,其中一个代码允许它由上面的单个绘图JPanel绘制。
  • 为此类提供一个方法,比如绘图JPanel将在其paintComponent中调用的public void draw(Graphics g)
  • 让绘图JPanel在其paintComponent方法中的for循环中遍历一个MyShape对象列表,在循环中调用draw(g)方法。

有关此答案的详细信息,请考虑使用您的问题创建和发布有效的MCVE计划。