2012-11-25 48 views
1

我有一个很好的问题,因为我有3类:使图形按钮的JPanel

  1. 窗框 - 它的一类扩展JFrame的,它会显示内部面板之一;
  2. WindowPanel - 它是一个扩展JPanel的类。我在那里布置BoxLayout。我想在WindowFrame中的其他面板之间切换;
  3. GButton - 它的一类像正常的按钮,但我对BG的质感,我想简单的由add(把它们添加到WindowPanel):

public class GButton extends JComponent implements MouseMotionListener, MouseListener{ 

    int x, y , w, h; //the coordinates of button 
    Graphics2D g2d; 

    public GButton(int x, int y){ 
     this.x = x; this.y = y; 
     this.w = 200; this.h = 100; 
     ... //add listeners, loading some information etc 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
     g2d = (Graphics2D) g; 
     ...//loading and draw on g2d 
     g2d.drawString("asidoaisjdiajsoidj",x,y); 
    } 

    //code with using events of mouse and so on 
} 

当我添加按钮,按钮的纹理是在y下面50px!下一个按钮增加了与y的这种差别。为什么?我知道这是因为我在帮助MouseMove事件中检查它。这不是一个大小不一的图像或类似的东西。为什么它不起作用,并且在其他地方绘制东西?更简单的方法来获得相同的效果?请回答:)

+0

花一些时间来阅读你不必'公众诠释了getX()'和'的getY()'你有办法吗?如果是这样,你可能会在不知不觉中重写JComponent的方法并导致灾难性的结果。 –

回答

0

永远不要保留对Graphics(以及2D)的全局引用。

如果您确实需要,请在每张图纸的末尾拨打g2d.dispose(),在下次打算使用它时获取新的图形上下文。

+0

你知道为什么吗? – nullpotent

+0

@ iccthedral:我敢打赌,你这样做。 :) –

+1

@MouseEvent如果你创建了图形上下文(即调用'Graphics#create'),你只需要调用'dispose',否则你不应该调用dispose - 如果你创建它, – MadProgrammer

1

但是,你在地上编码有点薄。

  • 请勿保留对Graphics上下文的引用。 1.它被重用; 2.它可能会在涂漆周期之间改变。您需要画到传递到您的组件的图形上下文中
  • 您必须调用super.paintComponent,这非常重要。

我不能100%确定,但是您觉得您需要画到按钮出现在屏幕上的x/y位置,这是不正确的。 Graphics上下文已被翻译,所以位置0x0是对象的顶部/左侧角落。

我建议你需要通过