上面是做完后的效果,第一次用java来做自定义继承button类控件,如图看到的其实就只有一个经改写的button控件,style_1、2、3、4 是button内部的几个小label而已,不过中间的滑动效果做得不太好,滑动时有闪烁,还请高手们指点指点啦......
如图里的style_1、2...是可以自己在外部添加自定义 listener ,调用如下:
myjb.addJblListener("1", new lblistener_1()); myjb.addJblListener("2", new lblistener_2()); myjb.addJblListener("3", new lblistener_3()); myjb.addJblListener("4", new lblistener_4());这样
再实现lblistener_1方法来,第一次写博文,没啥经验,如有不好的地方请大家不要太在意啦。。呵呵~
好,废话不多说了,直接上代码吧。。。
package jbutton_test;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
@SuppressWarnings("serial")
public class myJbutton extends JButton {
static JLabel lb = null;
static Timer t = null;
static myJbutton jb = null;
static boolean dire = false; // slider direction..
static int next_slider_x; // the X of the next location where the slider will go..
static int fir_slider_x ; // the first X of the slider..
static int slider_width ;//the width of the slider...
static boolean t_isrun = false;//is the timer running
ArrayList<JLabel> Jlb = new ArrayList<JLabel>();//JLabel container
public myJbutton(String labText[]) {
Dimension size = getPreferredSize();
size.width = get_Bwidth(labText);//set size..
size.height = 50;
setBackground(Color.white);
fir_slider_x = 35;//get the X of the first slider ..
slider_width = labText[0].length()*15+28;//get the width of the first slider ..
creatLab(labText);
setLayout(new FlowLayout(FlowLayout.LEFT, 30, 5));
setPreferredSize(size);
setContentAreaFilled(false);
}
//get the width of the button....
private int get_Bwidth(String str[]) {
int width = 0;
for(int i = 0;i<str.length;i++){
width += (str[i].length()*17+30);
}
width += 80;
return width;
}
//creatLab
private void creatLab(String labText[]) {
for (int i = 0; i < labText.length; i++) {
lb = new JLabel(labText[i]);
//lb.setFont(new Font("Jokerman", Font.BOLD, 20));
lb.setFont(new Font("华文琥珀", Font.BOLD, 30));
lb.setName(Integer.toString(i));
add(lb);
Jlb.add(lb);//add to the container...
lb.addMouseListener(new lab_lsn(lb));
lb.setCursor(new Cursor(Cursor.HAND_CURSOR));//set the cursor as hand when the cursor move into ...
}
}
//add listeners to each label (须外部调用才能添加label事件)
public void addJblListener(String lb_name, MouseListener l) {
int i;
lb_name = Integer.toString(Integer.parseInt(lb_name)-1);
for (i = 0; i < Jlb.size(); i++) {
JLabel lb_temp = Jlb.get(i);
if (lb_temp.getName().equals(lb_name)) {
lb_temp.addMouseListener(l);
break;
}
}
//当添加标签事件名字出错时执行
if(i >= Jlb.size()){
System.out.println("无法找到 "+lb_name+ " 标签,请核对该标签名字是否正确。。。");
return;
}
}
//inner listener of the label...(let the label get two listener)
class lab_lsn extends MouseAdapter {
JLabel l1 = null;
public lab_lsn(JLabel l1) {
this.l1 = l1;
}
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
slider_width = l1.getSize().width + 25;//get the next width of the next slider
next_slider_x = l1.getX() - 13;//get the next X of the slider
t = new Timer();
t_isrun = true;
t.schedule(new ttask(), 1, 3);
}
}
class ttask extends TimerTask {
@Override
public void run() {
paintComponent(getGraphics());
repaint();
}
}
@Override
public void paint(Graphics g) {
g.setColor(getBackground());
g.fillRoundRect(0, 0, getSize().width - 1, getSize().height - 1, 50, 50);
super.paint(g);
}
protected void paintComponent(Graphics g) {
if ((fir_slider_x == next_slider_x) && (t_isrun == true)) {
t.cancel();
t_isrun = false;
}
//g.setColor(Color.yellow);
Color color1 = Color.white;
Color color2 = Color.gray;
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(new GradientPaint(getSize().width/2, 1, color1, getSize().width/2, 100, color2));
g.fillRoundRect(fir_slider_x, 5, slider_width, 40, 50, 50);
if (t_isrun) {
if (fir_slider_x > next_slider_x) {
dire = false;
} else if (fir_slider_x < next_slider_x) {
dire = true;
}
if (dire == true) {
fir_slider_x += 1;
} else {
fir_slider_x -= 1;
}
}
//System.out.println("signal...");
}
protected void paintBorder(Graphics g) {
g.setColor(getForeground());
}
}
顺便加上main类的代码
package jbutton_test;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;import javax.swing.JFrame;
@SuppressWarnings("serial")
class frame extends JFrame {
public frame() {
super("按钮");
setLayout(new FlowLayout());
/*
* 下面是不同的label个数的数组
* 中英文都试过了。。
*/
//String[] labText = { "stye_1"};
//String[] labText = { "stye_1", "stye_2"};
//String[] labText = { "stye_1", "stye_2", "stye_3"};
String[] labText = { "stye_1", "stye_2", "stye_3", "stye_4"};
//String[] labText = { "stye_1", "stye_2", "stye_3", "stye_4" ,"stye_5"};
//String[] labText = { "stgfjh", "第二个标签", "stye_3", "stye","s4" ,"st", "2" ,"jgff", "3", "d","e", "g"};
myJbutton myjb = new myJbutton(labText);
add(myjb);
/*
* 下面是添加每个label的事件,都自定义的。。。格式是
* myjb.addJblListener("标签代号(第一个标签是1第二个是2以此类推,都是string型的)", new lblistener_1());
* new lblistener_1()是自己添加的mouselistener的子类,如下的lblistener_1类。。
*/
myjb.addJblListener("1", new lblistener_1());
myjb.addJblListener("2", new lblistener_2());
myjb.addJblListener("3", new lblistener_3());
myjb.addJblListener("4", new lblistener_4());
//myjb.addJblListener("5", new lblistener_5());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setResizable(false);
this.getContentPane().setBackground(Color.DARK_GRAY);
setVisible(true);
}
class lblistener_1 extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
getContentPane().setBackground(Color.DARK_GRAY);
super.mouseClicked(e);
}
}
class lblistener_2 extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
getContentPane().setBackground(Color.pink);
super.mouseClicked(e);
}
}
class lblistener_3 extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
getContentPane().setBackground(Color.cyan);
super.mouseClicked(e);
}
}
class lblistener_4 extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
getContentPane().setBackground(Color.orange);
//System.exit(0); //close the window...
super.mouseClicked(e);
}
}
class lblistener_5 extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
getContentPane().setBackground(Color.orange);
super.mouseClicked(e);
}
}
}public class jbutt_main {
public static void main(String[] args) {
new frame();
}
}