Java想用Swing做一个关闭按钮,会用Swing的请进

就如同360的关闭按钮,和这个关闭按钮效果一样,应该怎么做呢,哪个按钮用“X”,通过处理鼠标事件,来改变背景色,一共有三种状态,鼠标进入的红色和鼠标按下的深红还有鼠标用移... 就如同360的关闭按钮,

和这个关闭按钮效果一样,应该怎么做呢,哪个按钮用“X”,通过处理鼠标事件,来改变背景色,一共有三种状态,鼠标进入的红色 和 鼠标按下的深红还有鼠标用移出的透明背景
现在设置背景色的方法已经写好,可以直接setBackground()设置,现在的问题是,如何处理鼠标事件才能够和360的按钮效果意义呢,感觉逻辑太复杂了,实在是搞不定了
目前有以下两个难点,希望能够针对难点解决
1、360的按钮有这样的一个行为,就是在按钮外边按下鼠标,然后进入按钮,按钮的状态不发生任何变化,这个用普通的鼠标进入事件是做不到的
2、鼠标按下,没有松开鼠标,移出按钮,并没有发生状态变化
展开
 我来答
匿名用户
2014-06-29
展开全部
这个是我以前写的类似的按钮。可以参考一下。
package AwtTest;
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
/**
 * JButton 类的子类,作为关闭按钮使用,上面是一个 红X
 * @author Forever
 *
 */
public class CloseButton extends JButton{
 /**
  * 
  */
 private static final long serialVersionUID = 1L;
 private final int delta = 6; 
 private final int delta1 = 15;
 private final Color BUTTON_COLOR1 = new Color(255, 0, 0, 0);
 private final Color BUTTON_COLOR2 = new Color(0,0,100,20);
 private final GradientPaint p1 = new GradientPaint(0.0F, 0.0F, new Color(0,0,0,0), 0.0F,
   getHeight(), BUTTON_COLOR2, true);
 private final GradientPaint p2 = new GradientPaint(0.0F, 0.0F, BUTTON_COLOR1, 0.0F,
   getHeight(), BUTTON_COLOR2, true);
 private final GradientPaint p3 = new GradientPaint(0.0F, 0.0F, BUTTON_COLOR1, 0.0F,
   getHeight(), BUTTON_COLOR2, true);
 private final GradientPaint p4 = new GradientPaint(0.0F, 0.0F, BUTTON_COLOR1, 0.0F,
   getHeight(), BUTTON_COLOR2, true);
// private Color orgin = new GradientPaint(0.0F, 0.0F, Color.WHITE, 0.0F,
//   getHeight(), Color.RED, false);
 private Dimension dem = new Dimension(40,20);
 private Font font  = new Font("微软雅黑",Font.BOLD,15);
 public CloseButton()
 {
  
  
  
  //this.setFont(font);
  this.setForeground(Color.white);
  this.setBackground(Color.black);
  this.setText("X");
  this.setUI(new BasicButtonUI());
  this.setToolTipText("关闭");
  this.setContentAreaFilled(false);
  this.setBorderPainted(true);
  this.setPreferredSize(dem);
  this.setBorder(BorderFactory.createRaisedBevelBorder());
  
 }
 @Override
 protected void paintComponent(Graphics g)
 {
  
  Graphics2D g2d = (Graphics2D)g.create();
  Rectangle2D.Float re = new Rectangle2D.Float(0,0,getWidth(),getHeight());
  Line2D.Float L1 = new Line2D.Float(new Point(15,6),new Point(25,14) );
  Line2D.Float L2 = new Line2D.Float(new Point(15,14),new Point(25,6) );
  
  
  g2d.setClip(re);
  g2d.setStroke(new BasicStroke(2.3F,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND));
  GradientPaint gp = new GradientPaint(0.0F, 0.0F, Color.LIGHT_GRAY, 0.0F,
    getHeight(), Color.RED, false);
  if(getModel().isRollover())
  {
   gp = new GradientPaint(0.0F, 0.0F, Color.WHITE, 0.0F,
     getHeight(), Color.RED, true);
  }
   if(getModel().isPressed())
  {
   gp = new GradientPaint(0.0F, 0.0F, Color.GRAY, 0.0F,
     getHeight(), Color.RED, true);
  }

  g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
    1F));
  g2d.draw(re);
  g2d.setPaint(gp);
  
  g2d.fill(re);

  /**
   * 这些代码用于将字母X的轮廓剪贴出来,but in vain;
   */
  /*
        FontRenderContext context = g2d.getFontRenderContext();
  TextLayout layout = new TextLayout("X", new Font("华文中宋",Font.BOLD,30),context);
  AffineTransform transform = AffineTransform.getTranslateInstance(0, 100);
  Shape outline = layout.getOutline(transform);
  g2d.setColor(Color.red);
        GeneralPath shape = new GeneralPath();
        shape.append(outline, false);
        g2d.setColor(c);
        g2d.draw(shape);*/
  //     super.paintComponent();
 
 // g2d.drawString("X", 0.00f, 0.00f);
//  g.drawString("X", 0, 0);
  g2d.setColor(Color.WHITE);
  g2d.setStroke(new BasicStroke(2.3F));
  g2d.draw(L1);
  g2d.setStroke(new BasicStroke(2.3F));
  g2d.draw(L2);
  BasicStroke bs = new BasicStroke(0F);
     g2d.setStroke(bs);
       g2d.setColor(Color.BLACK);
     g2d.draw(re);
  g2d.dispose();
//  super.paintComponent(g);
  
 }
 private class TabButton extends JButton{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  /**
   * 初始化关闭按钮
   */
  public TabButton() {
   int size = 17;
   setPreferredSize(new Dimension(size, size));
   setToolTipText("关闭");
   setUI(new BasicButtonUI());
   setContentAreaFilled(false);
   setFocusable(false);
   setBorder(BorderFactory.createEtchedBorder());
   setBorderPainted(false);
   setRolloverEnabled(true);
  }
 }
 public static void main(String args[])
 {
//  try {
//   // 将LookAndFeel设置成Windows样式
//   UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//  } catch (Exception ex) {
//   ex.printStackTrace();
//  }
  JFrame frame = new JFrame();
  frame.setSize(300,400);
  JPanel jp = new JPanel();
  CloseButton bt = new CloseButton();
  JButton b2 = new JButton("123");
//  b2.setContentAreaFilled(false);
  jp.add(bt);
       // frame.setLayout(manager)
  frame.add(jp,"North");
  frame.add(b2,"South");
  frame.setVisible(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
 }
 
}
更多追问追答
追问
你的方法的确可行,我用的是JPanel做的,用JPanel可以实现吗,目前有太多按钮都是用JPanel来做的
追答
//jpanel中也有paintComponent(),可以实现,不过要自己注册监听器。以下是我写的部分代码 
protected void paintComponent(Graphics g)
 {
  
  Graphics2D g2d = (Graphics2D)g.create();
    Rectangle2D.Float re = new Rectangle2D.Float(0,0,getWidth(),getHeight()); 
    g2d.setClip(re); 
    g2d.setStroke(new BasicStroke(2.3F,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND)); 
    GradientPaint gp = new GradientPaint(0.0F, 0.0F, Color.LIGHT_GRAY, 0.0F, 
      getHeight(), Color.RED, false); 
    if(ispressed) 
    { 
     gp = new GradientPaint(0.0F, 0.0F, Color.WHITE, 0.0F, 
       getHeight(), Color.RED, true); 
    } 
    else 
    { 
     gp = new GradientPaint(0.0F, 0.0F, Color.GRAY, 0.0F, 
       getHeight(), Color.RED, true); 
     } 
      g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 
        1F)); 
      g2d.draw(re); 
      g2d.setPaint(gp); 
      g2d.fill(re);
 }
//通过监听器控制ispressed就可以了,改变之后不要忘了updateUI();
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式