>我有一个很好的问题,因为我有 3 个类:
- WindowFrame - 这是一个扩展JFrame的类,它将显示内部的一个面板;
- WindowPanel - 它是一个扩展 JPanel 的类。我在那里有布局框布局。我想在窗口框架中的其他面板之间切换;
- 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 相比已经扩大了这种差异。为什么?我知道这一点,因为我在鼠标移动事件的帮助下检查它。这不是一个糟糕的图像大小或类似的东西。为什么它不起作用,而是在其他地方画东西?获得相同效果的更简单方法吗?请回答:)
但是,您在地面上的代码有点薄。
- 不要维护对
Graphics
上下文的引用。 1.重复使用;2.它可能会在油漆周期之间发生变化。 您需要在传递给组件的图形上下文中绘画 - 你必须打电话给
super.paintComponent
,这非常重要。
我不能 100% 确定,但您似乎觉得您需要绘制到按钮出现在屏幕上的 x/y 位置,这是不正确的。 Graphics
上下文已被转换,因此位置0x0是对象的上角/左上角。
我建议你需要花一些时间通读
- 执行自定义绘画
- 在AWT和Swing中绘画
永远不要保留对Graphics
(以及 2D)的全局引用。
如果需要,请在每个图形的末尾调用g2d.dispose()
,以便在下次要使用它时获取新的图形上下文。