1

我有一个很好的问题,因为我有 3 个课程:

  1. WindowFrame - 它的一个类扩展了 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 事件检查它。这不是一个糟糕的图像大小或类似的东西。为什么它不起作用,它在其他地方画东西?更简单的方法可以获得相同的效果吗?请回答 :)

4

2 回答 2

1

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

  • 不要维护对Graphics上下文的引用。1、重复使用;2. 油漆周期之间可能会发生变化。您需要在传递给组件的图形上下文中进行绘制
  • 你必须打电话super.paintComponent,这非常重要。

我不能 100% 确定,但您似乎认为您需要绘制到按钮出现在屏幕上的 x/y 位置,这是不正确的。上下文已经被翻译,Graphics因此位置 0x0 是对象的上/左角。

我建议你需要花一些时间阅读

于 2012-11-25T03:18:33.033 回答
0

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

如果确实需要,请g2d.dispose()在每个绘图结束时调用,以便在下次使用时获取新的图形上下文。

于 2012-11-25T01:19:02.647 回答