按钮"复制"在JPanel上绘图

时间:2014-03-11 23:50:11

标签: java swing graphics awt

因此,出于某种原因,在将表单绘制到我的JPanel时,我的JFrame的BorderLayout中的其他元素将被复制到Panel中。这是我的两个班级:

public class Simulation extends JFrame {

    private JPanel contentFrame;
    private Map map;

    public Simulation() {
        super("Städte Simulation");
        setBounds(200, 200, 800, 800);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        contentFrame = new JPanel();
        contentFrame.setDoubleBuffered(true);
        contentFrame.setLayout(new java.awt.BorderLayout());
        javax.swing.JButton jButton1 = new javax.swing.JButton("jButton1");
        map = new Map();
        javax.swing.JButton jButton5 = new javax.swing.JButton("jButton5");
        contentFrame.add(jButton1, java.awt.BorderLayout.PAGE_START);
        contentFrame.add(map, java.awt.BorderLayout.CENTER);
        contentFrame.add(jButton5, java.awt.BorderLayout.LINE_END);
        getContentPane().add(contentFrame);
        setVisible(true);
    }
}

public class Map extends JPanel {

    private LinkedList<Town> towns;

    public Map() {
        super();
        this.addMouseListener(new CustomMouseListener());
        towns = new LinkedList<Town>();
    }

    @Override
    public void paint(Graphics g) {
        if (towns.size() > 0)
            for (Town t : towns)
                g.fillRect(t.getX() - 10, t.getY() - 10, 20, 20);
    }

    class CustomMouseListener implements MouseListener {
        public void mouseClicked(MouseEvent e) {
            towns.add(new Town(e.getX(), e.getY()));
            repaint();
        }

        public void mousePressed(MouseEvent e) {
        }

        public void mouseReleased(MouseEvent e) {
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }
    }
}

这就是发生的事情: 这个: enter image description here 变成这样: enter image description here

1 个答案:

答案 0 :(得分:4)

欢迎来到破碎油漆链的精彩世界。 Swing中的绘画是一个复杂的过程,可以通过一些你可以覆盖的简单方法来实现。这些方法链接在一起,以提供用于绘制组件的功能。

如果您覆盖其中一种方法,则需要将其称为父实现。

所以,简单的解决方案就是......

@Override
public void paint(Graphics g) {
    super.paint(g);
    if (towns.size() > 0)
        for (Town t : towns)
            g.fillRect(t.getX() - 10, t.getY() - 10, 20, 20);
}

然而,这不是一个好主意。 paint是绘制链中的顶级方法之一,它负责调用许多子方法。为了保持功能并保持简单,建议您覆盖paintComponent而不是

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (towns.size() > 0)
        for (Town t : towns)
            g.fillRect(t.getX() - 10, t.getY() - 10, 20, 20);
}

花点时间阅读并理解Painting in AWT and SwingPerforming Custom Painting

Ps- Swing组件默认为双缓冲,因此不需要contentFrame.setDoubleBuffered(true);