制作图形按钮到JPanel



>我有一个很好的问题,因为我有 3 个类:

  1. WindowFrame - 这是一个扩展JFrame的类,它将显示内部的一个面板;
  2. WindowPanel - 它是一个扩展 JPanel 的类。我在那里有布局框布局。我想在窗口框架中的其他面板之间切换;
  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 相比已经扩大了这种差异。为什么?我知道这一点,因为我在鼠标移动事件的帮助下检查它。这不是一个糟糕的图像大小或类似的东西。为什么它不起作用,而是在其他地方画东西?获得相同效果的更简单方法吗?请回答:)

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

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

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

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

  • 执行自定义绘画
  • 在AWT和Swing中绘画

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

如果需要,请在每个图形的末尾调用g2d.dispose(),以便在下次要使用它时获取新的图形上下文。

相关内容

  • 没有找到相关文章

最新更新