簡體   English   中英

在JPanel上的圖形上“復制”按鈕

[英]Buttons “copied” on Drawing on JPanel

因此,由於某些原因,在將窗體繪畫到我的JPanel時,我JFrame的BorderLayout中的其他元素會復制到面板中。 這是我的2個班級:

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) {
        }
    }
}

這就是發生的情況:這: 在此處輸入圖片說明 變成這樣: 在此處輸入圖片說明

歡迎來到油漆鏈斷裂的美好世界。 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是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);
}

花時間通讀並理解AWT中的繪畫以及Swing執行定制繪畫

Ps-Swing組件默認情況下是雙緩沖的,因此不需要contentFrame.setDoubleBuffered(true);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM