因此,出于某种原因,在将表单绘制到我的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) {
}
}
}
这就是发生的事情: 这个: 变成这样:
答案 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 Swing和Performing Custom Painting
Ps- Swing组件默认为双缓冲,因此不需要contentFrame.setDoubleBuffered(true);