Java想用Swing做一个关闭按钮,会用Swing的请进
就如同360的关闭按钮,和这个关闭按钮效果一样,应该怎么做呢,哪个按钮用“X”,通过处理鼠标事件,来改变背景色,一共有三种状态,鼠标进入的红色和鼠标按下的深红还有鼠标用移...
就如同360的关闭按钮,
和这个关闭按钮效果一样,应该怎么做呢,哪个按钮用“X”,通过处理鼠标事件,来改变背景色,一共有三种状态,鼠标进入的红色 和 鼠标按下的深红还有鼠标用移出的透明背景
现在设置背景色的方法已经写好,可以直接setBackground()设置,现在的问题是,如何处理鼠标事件才能够和360的按钮效果意义呢,感觉逻辑太复杂了,实在是搞不定了
目前有以下两个难点,希望能够针对难点解决
1、360的按钮有这样的一个行为,就是在按钮外边按下鼠标,然后进入按钮,按钮的状态不发生任何变化,这个用普通的鼠标进入事件是做不到的
2、鼠标按下,没有松开鼠标,移出按钮,并没有发生状态变化 展开
和这个关闭按钮效果一样,应该怎么做呢,哪个按钮用“X”,通过处理鼠标事件,来改变背景色,一共有三种状态,鼠标进入的红色 和 鼠标按下的深红还有鼠标用移出的透明背景
现在设置背景色的方法已经写好,可以直接setBackground()设置,现在的问题是,如何处理鼠标事件才能够和360的按钮效果意义呢,感觉逻辑太复杂了,实在是搞不定了
目前有以下两个难点,希望能够针对难点解决
1、360的按钮有这样的一个行为,就是在按钮外边按下鼠标,然后进入按钮,按钮的状态不发生任何变化,这个用普通的鼠标进入事件是做不到的
2、鼠标按下,没有松开鼠标,移出按钮,并没有发生状态变化 展开
1个回答
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();
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询