Java Swing在其他组件上绘制对象

4

我正在尝试制作一个小型的绘画程序。我在JFrame上方放置了一个JPanel,并且在其上绘制对象(我使用Netbeans 6.9)。我已经实现了一些基本功能,比如字体、线条和矩形填充。我使用的是覆盖paintComponent()方法的标准绘图方法。

class .... extends JPanel
{
@Override
void paintComponents(Graphics g)
{
.......
}
}

问题是当我在一个区域内绘制文本、线条时,它们会被画在下面而不是上面。基本上,我想把对象画在所有之前已经在JPanel中绘制过的其他对象的上方。我真的不想切换到其他类型的分层窗格。一个非常幼稚的方法是撤销每个对象并按相反的顺序绘制它们(最后一个先绘制)。


感谢David的帮助。我确实调用了paintComponent,但该死的东西不会覆盖它的兄弟节点。我想glasspane听起来像是一个解决方案,但需要太多的开销。我会看看是否能找到其他方法。顺便说一下,我已经对你的解决方案进行了评分。谢谢。 - Dipendra Kumar Mishra
2个回答

4
您需要重写paintComponent(Graphics g)方法,不要忘记调用super.paintComponent(Graphics g);
class .... extends JPanel
{
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);//honor paintComponent an call super to draw other components that were added to the JPanel
        .......
    }
}

您可能还需要覆盖JPanelgetPreferredSize(..)方法,并返回适当的大小,以便JPanel可见:
class .... extends JPanel
{
    @Override
    public Dimension getPreferredSize()
    {
        return new Dimension(300,300);
    }
}

编辑:

根据您所做的操作,您可能还需要查看GlassPane,它可以让您在整个JFrame窗口上设置一个透明的窗格,并且可以进行绘制,这将导致图形绘制在所有其他内容之上,如下图所示:

enter image description here


0

这是一个老问题,但我遇到了同样的问题,并通过覆盖paintChildren(Graphics g)而不是paintComponent来解决它。

正如Oracle文档所述,三个paint方法的执行顺序为:

protected void paintComponent(Graphics g) 
    protected void paintBorder(Graphics g)
      protected void paintChildren(Graphics g)

所以,paintChildren(g) 最后运行,这意味着我们在其中绘制的任何内容都会绘制在先前绘制的所有组件之上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接