Java paintComponent描绘了顶层GUI面板的副本,没有明显的原因

时间:2012-12-08 00:52:29

标签: java swing paintcomponent

我正在使用Java编写一个简单的绘图应用程序,但Swing不想合作。起初我尝试制作一个包含DrawArea和设置面板的JTabbedPane,但由于某些奇怪的原因,第二个mouseDragged()(以及扩展的drawArea.repaint()方法)被触发,JTabbedPane似乎复制。想象一下垂直堆叠的两个相同的标签窗格。我认为这只是JTabbedPane中的一些错误,但我在一个面板上使用JButton重写了一个非常简单的自定义菜单,并且发生了完全相同的事情。它不像GUI实际上复制了顶部区域;它无法使用,我可以画它。看看这个: enter image description here

编辑:我找到了similar question。如果我调用super.paintComponent(g),问题就会消失(并且drawArea.setBackground(color)实际上正常工作!)但是super上调用的函数(对我来说是一个新的关键字)基本上重新绘制了drawArea以便绘制它小道不再保存。

如果我绘制一个矩形来填充drawArea,它会覆盖问题,即使仍然触发了mouseDragged。这是渲染代码:

@Override
public void mouseDragged(MouseEvent e) {
    x = e.getX(); y = e.getY();
    drawArea.repaint();
}

// (subclass):
class DrawArea extends JPanel {
    public void paintComponent(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillOval(x-3, y-3, 7, 7);
    }
}

这是GUI代码:

    frame = new JFrame("Jadra");
    frame.setSize(650, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    menu = new JPanel();

    settingsButton = new JButton("Settings");
    clearButton = new JButton("Clear");
    exitButton = new JButton("Quit");

    menu.setLayout(new FlowLayout());
    menu.add(settingsButton);
    menu.add(clearButton);
    menu.add(exitButton);
    menu.setBackground(new Color(30, 90, 60));

    drawArea = new DrawArea();
    drawArea.setBackground(Color.red);
    drawArea.setOpaque(true);
    drawArea.addMouseMotionListener(this);

    frame.getContentPane().add(menu, BorderLayout.NORTH);
    frame.getContentPane().add(drawArea, BorderLayout.CENTER);

    Thread pt = new Thread(new Painter());
    frame.setVisible(true);
    pt.start();

请告诉我,我做了一件非常愚蠢的事。否则这看起来像一个非常讨厌的bug。我非常感谢你的帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

您的DrawPanel.paintComponent()方法应该向上链接到它从JPanel覆盖的方法,以允许进行默认绘制。只需添加

super.paintComponent(g);

作为此方法的第一行。