为JPanel制作图形按钮

时间:2012-11-25 01:11:33

标签: java swing graphics jpanel jcomponent

我有一个很好的问题,因为我有3个班级:

  1. WindowFrame - 它的一个类扩展了JFrame,它将显示其中一个面板;
  2. WindowPanel - 它是一个扩展JPanel的类。我在那里布局BoxLayout。我想在WindowFrame中的其他面板之间切换;
  3. GButton - 它类似于普通按钮,但我的纹理在bg上,我希望通过add()将它们添加到WindowPanel:

  4. 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事件检查它。图像或类似的东西不是很糟糕。为什么它不起作用,它在其他地方画画?更简单的方法来获得相同的效果?请回答:)

2 个答案:

答案 0 :(得分:1)

然而,你在地面上编码有点薄。

  • 不要保留对Graphics上下文的引用。它被重用了;它可能会在油漆循环之间发生变化。您需要绘制到传递给组件的图形上下文
  • 你必须致电super.paintComponent,这非常重要。

我无法百分百肯定,但您认为您需要在按钮出现在屏幕上的x / y位置进行绘制,这是不正确的。 Graphics上下文已被翻译,因此位置0x0是对象的左上角。

我建议你需要花点时间阅读

答案 1 :(得分:0)

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

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