Swing里面的按钮JButton默认是矩形的,有时候为了特别用途,我们需要圆形的按钮,今天我们就来自定义一个Swing组件------JRoundButton.上面是组件的截图.

以前也看过别人的实现方式,那就是写一个JButton的子类,然后重写其paintComponent方法,再在paintComponent方法中绘制一个圆,具体思路如下: 

protected void paintComponentf(Graphics g)

{

              g.fillOval(0 ,0, getWidth(), getHeight());

              ......

}         

  ......

                    这样生成的按钮确实是一个圆形的,但当你点击这个按钮时,你会发现它仍有一个矩形框出现,这是因为只要继承了JButton,Swing就默认把它的UI 设置成ButtonUI(除非你显式地设置了UI),相当于在UI里面绘制了矩形框,在paintComponent方法里面绘制了圆形背景,所以那个矩 形框就一直在.

                    所以,要实现真正的圆形按钮,你要为其定制UI.定制的UI一般都是ComponentUI的子类,并在其paint方法中实现组件的绘制.下面是我的RoundButtonUI中实现绘制圆形的核心代码:

public void paint(Graphics g, JComponent c)
{
    paintBackground(g);
}

 

protected void paintBackground(Graphics g)
{         
          int width = component.getWidth();
          int height = component.getHeight();
          Graphics2D g2d = (Graphics2D) g;

        //为简便起见我就用组件的背景色了,其实用的是渐变颜色的绘制,如上图
          Color color = component.getBackground();
          g2d.setColor(color);
          g2d.fillOval(0, 0, width,  height);           
}

              当然上面只是完成了圆形的绘制,实际上还要考虑边框的绘制以及鼠标按下时的绘制等,其思想基本一样,要绘制边框就把fillOval换成drawOval,要绘制鼠标按下的圆就重新设置一种颜色再fillOval. 

              这样只是绘制出了圆形的组件,但它其实还是方的,只不过我们没有绘制矩形边框而已,因此,只要你在组件之内,圆形区域之外点击鼠标的话,如果该组件有事件 监听器,它的ActionEvent就会被触发.作为圆形按钮,我们肯定不希望它这样了,因此就要重写它的contains方法.下面是我的代码(我的按 钮其实是椭圆的,只不过当长轴和短轴相等的时候就成了一个圆了,这样按钮的功能就更大了)

public boolean contains(JComponent cc, int x, int y)
{
              float m = x * 1.0f;
              float n = y * 1.0f;
              float a = (bot_right_x - top_left_x) / 2;
              float b = (bot_right_y - top_left_y) / 2;
              float c = component.getWidth() / 2;
            float d = component.getHeight() / 2;
   
              return ((m - c) * (m - c)) / (a * a) + ((n - d) * (n - d)) / (b * b)  <= 1;
}

              实际上也就是按照椭圆内或着椭圆上任何一点带入椭圆方程中都不会大于1而算的.这样我们的组件就真正是圆形的了.

              还需要解决的问题就是为按钮绘制标签,并且根据按键重新去绘制组件了,其绘制思想也都是相当的简单,我就不在再叙述!

              最后再写一个继承自JComponent的类JRoundButton,然后把它的UI设置为RoundButtonUI,再为它添加上事件监听器,这样,一个真正的JRoundButton就诞生了!

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()