[英]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.