实现类似XP风格的快速按钮

原创 2004年07月16日 11:30:00
实现功能: 类似于Windows XP中的快速按钮的风格, 允许指定按钮的状态是自弹起(就是鼠标键按下时按钮产生被按下的效果, 鼠标键抬起的时候按钮自动回复原状)着是开关按钮(点击一次, 按钮被按下, 再点击一次, 按钮被弹起), 并能够设定一组(多个)或多组互斥按钮(即同组中有且只有一个按钮一直处于被按下的状态). 当然, 这个类不是很完善, 有许多地方可以改进, 比如没有加入当按钮处于禁止使用的状态(Disabled), 应该再引入一个Image来显示成灰色的效果等. 您就自己改改吧. :)

程序代码:
SpeedButton.java
--------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SpeedButton extends JButton implements MouseListener {
private boolean entered = false; /* 标志, 用于判断鼠标是否在按钮上 */
private boolean downed = false; /* 标志, 用于按钮是否被按下 */

private boolean enabledDowned = false; /* 标志, 用于按钮是否允许被按下 */

private Image image = null;
private int groupID = 0; /* 指定按钮属于哪个互斥组, 取值为0时不判断 */

private int buttonID; /* 按钮本身的ID号, 唯一 */

/**
* 这个构造器有点烦, 这里可以进行优化成多个构造器来组合.
* @see com.javax.swing.JButton
* @author delfan,2002.07.23
* @version 1.0
*/
public SpeedButton(int buttonID, Image image, int width, int height, String tip, boolean enabledDowned,boolean initmode, int groupID, ActionListener actionListener) {
this.buttonID = buttonID;
this.image = image;
addMouseListener(this);
setPreferredSize(new Dimension(width, height));
setToolTipText(tip);
this.enabledDowned = enabledDowned;
this.groupID = groupID;
downed = initmode;
addActionListener(actionListener);
}

public void paint(Graphics g) {
if (getSize().height == 2 || getSize().width == 2) { // 画分隔条, 当按钮宽度或高度为2的时候,
g.setColor(new Color(119, 133, 168)); // 认为是分隔条
g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
g.setColor(new Color(129, 143, 178));
g.fillRect(1, 1, getWidth(), getHeight());
setEnabled(false);
}
else
{
if (entered) { // 鼠标在按钮内
g.setColor(new Color(119, 133, 168));
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(8, 36, 107));
g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
if (image != null) g.drawImage(image, 2, 2, getParent());
} else { // 鼠标不在按钮内
g.setColor(getParent().getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
if (image != null) g.drawImage(image, 2, 2, getParent());
}

if (downed) { // 按钮被按下
g.setColor(new Color(181, 190, 214));
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(8, 36, 107));
g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
if (image != null) g.drawImage(image, 3, 3, getParent());
}
}
}

public void update(Graphics g) {paint(g);}

/**
* 按钮是否处于按下状态
*/
public boolean isDowned() {return downed;}

/**
* 取得按钮的组索引号
*/
public int getGroupID() {return groupID;}

public void setDowned(boolean downed) {this.downed = downed;repaint();}

public void mouseEntered(MouseEvent e) {entered = true;repaint();}

public void mouseExited(MouseEvent e) {entered = false;repaint();}

public void mouseClicked(MouseEvent e) {}

public void mousePressed(MouseEvent e) {
if (enabledDowned && downed && groupID == 0)
downed = false;
else
downed = true;
repaint();
}

public void mouseReleased(MouseEvent e) {
if (!enabledDowned) downed = false;
repaint();
if (groupID != 0) // 通过存放按钮的容器进行互斥按钮的状态改变操作
for (int i = 0; i < getParent().getComponentCount(); i++)
if (getParent().getComponent(i) instanceof SpeedButton) {
if (((SpeedButton) getParent().getComponent(i)).getGroupID() == groupID
&& ((SpeedButton) getParent().getComponent(i)) != this)
((SpeedButton) getParent().getComponent(i)).setDowned(false);
}
}

public int getButtonID() {return buttonID;}

}

让MFC程序具有XP风格的按钮及界面

VC++6.0编译生成的MFC程序没有XP风格的界面,显得不是太美观,下面,我们可以采取两种方法来让其显示XP风格的界面。   第一种方法比较简单,只需要一个小小的文件就可以。但是有一个缺点,就是这个...
  • zjccsg
  • zjccsg
  • 2016年07月16日 19:57
  • 544

如何使得WIN7下用VS2010做出的MFC程序具有XP风格(摆脱传统界面的效果)

VS2010建一个MFC的工程后,运行生成的对话框还有按钮之类的资源控件的风格是XP以前的传统的界面风格,效果不太令人满意。                                ...
  • xiaoxiaomao410
  • xiaoxiaomao410
  • 2014年09月05日 15:58
  • 2518

在.NET程序的窗体中使用XP风格的控件

在 .NET 程序的窗体中使用 XP 风格的控件 在 .NET 程序的窗体中使用 XP 风格的控件 原著:微软 Visual Studio 团队的 Seth Grossman,2002...
  • PeterPlus
  • PeterPlus
  • 2004年10月11日 11:25
  • 1148

让 VB6 开发的程序拥有视觉样式( XP 风格),VC++6.0 同样适用

让 VB6 开发的程序拥有视觉样式( XP 风格),VC++6.0 同样适用。     相信用 VB6 或 VC6 开发过程序的朋友都曾郁闷过吧,VB6 或 VC6 做的程序都没有视觉样式(XP...
  • ROVAST
  • ROVAST
  • 2014年05月19日 16:58
  • 2404

VC程序中Windows XP风格程序界面的实现

文章原创,转载请注明出处 默认情况下用MVC++98创建的MFC应用程序的界面使用5.82版本的ComCtrl32.dll中控件,使得其风格为Windows 2000系统的风格, 看上去绘制得比较...
  • menglongbor
  • menglongbor
  • 2013年01月17日 16:19
  • 3079

XP风格按钮的实现

方法一:利用XPButton类实现 具体操作步骤如下: 1.从互联网上下载XPButton类; 2.创建基于对话框的MFC工程Test,将下载的XPButton.cpp和XPButton.h放到...
  • huihui0121
  • huihui0121
  • 2011年09月27日 13:48
  • 1629

MFC 实现XP样式

对Visual C++ 6.0的程序实现XP样式: 它不仅对Visual C++ 6.0写的程序管用,对其它以前已经编写的在XP界面下显示为旧样式的程序同样有效。将下面文本保存为yo...
  • lingtianyulong
  • lingtianyulong
  • 2014年03月26日 16:47
  • 939

c# 中实现 winxp 风格的控件(超简单-zz)

环境:winxp, vs.net2003方法如下:第一步:在 Main() 函数中加一条语句:static void Main(){    Application.EnableVisualStyles...
  • dsing
  • dsing
  • 2005年03月15日 09:17
  • 795

Delphi 7 下自动实现 xp 风格的简单办法

以 Delphi 开发的程序运行在 xp 下时无法自动应用 xp 皮肤风格,  在网上查资料要达到程序自动适应 xp 风格效果很难, 而且大多都是使用一堆外部控件才能达到这样的效果.今天突然发现,  ...
  • helloqiner
  • helloqiner
  • 2005年11月28日 14:25
  • 1569

VB6编程实现XP风格

VB6编程实现XP风格 有 Windows XP系统后,网上就开始讨论VB6编程实现XP风格。我在编写《股票管理大师》时,在网上收集整理了两种方法。 第一种方法是用manifest文件实现XP风格 用...
  • htsoft
  • htsoft
  • 2011年07月05日 08:59
  • 1111
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现类似XP风格的快速按钮
举报原因:
原因补充:

(最多只允许输入30个字)