`
mmdev
  • 浏览: 12953528 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Java自定义JSlider UI

 
阅读更多
JSlider作为Swing中提供的滑标组件, 以图形方式在有界区间内通过移动滑块来选择值,滑块可以显示主刻度标记和次刻度标记。大量应用于如播放器中的音量设定等领域中。

但是JSlider本身提供的UI样式很单调,不足以满足用户的审美需求,往往需要我们自行重构其UI。

下面我给出一个简单的例子。

packageorg.loon.framework.swing.test;

importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Component;
importjava.awt.Dimension;
importjava.awt.EventQueue;
importjava.awt.GradientPaint;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.Polygon;
importjava.awt.Rectangle;
importjava.awt.RenderingHints;

importjavax.swing.Box;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JSlider;
importjavax.swing.WindowConstants;
importjavax.swing.event.ChangeEvent;
importjavax.swing.event.ChangeListener;

/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/

publicclassExampleSliderextendsJPanel...{
/***//**
*
*/

privatestaticfinallongserialVersionUID=1L;

publicExampleSlider()...{
//设定布局器
super(newBorderLayout());
//设定监听器
ChangeListenerlistener=newChangeListener()...{
publicvoidstateChanged(ChangeEvente)...{
if(e.getSource()instanceofJSlider)...{
System.out.println(
"刻度:"
+((JSlider)e.getSource()).getValue());
}

}

}
;
//设定JSlider1
JSliders1=newJSlider(0,100,0);
//注入自定义ui
s1.setUI(newMySliderUI());
//主刻度
s1.setMajorTickSpacing(10);
//次刻度
s1.setMinorTickSpacing(5);
//设定为显示
s1.setPaintTicks(true);
s1.setPaintLabels(
true);
//监听slider1
s1.addChangeListener(listener);
//设定JSlider2
JSliders2=newJSlider(0,100,0);
//使用MetalSliderUI为ui
s2.setUI(newjavax.swing.plaf.metal.MetalSliderUI()...{
protectedvoidpaintHorizontalLabel(Graphicsg,intv,Componentl)...{
JLabellbl
=(JLabel)l;
lbl.setForeground(Color.green);
super.paintHorizontalLabel(g,v,lbl);
}

}
);

s2.setForeground(Color.BLUE);
s2.setMajorTickSpacing(
10);
s2.setMinorTickSpacing(
5);
s2.setPaintTicks(
true);
s2.setPaintLabels(
true);
s2.addChangeListener(listener);

//使用盒式容器
Boxbox=Box.createVerticalBox();
box.add(Box.createVerticalStrut(
5));
box.add(s1);
box.add(Box.createVerticalStrut(
5));
box.add(s2);
box.add(Box.createVerticalGlue());
add(box,BorderLayout.CENTER);
add(Box.createHorizontalStrut(
5),BorderLayout.WEST);
add(Box.createHorizontalStrut(
5),BorderLayout.EAST);
//设定窗体大小
setPreferredSize(newDimension(240,100));
}


publicstaticvoidmain(String[]args)...{
EventQueue.invokeLater(
newRunnable()...{
publicvoidrun()...{
createUI();
}

}
);
}


publicstaticvoidcreateUI()...{
JFrameframe
=newJFrame("音量刻度设置");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(
newExampleSlider());
frame.setResizable(
false);
frame.pack();
//居中
frame.setLocationRelativeTo(null);
frame.setVisible(
true);
}

}


classMySliderUIextendsjavax.swing.plaf.metal.MetalSliderUI...{
/***//**
*绘制指示物
*/

publicvoidpaintThumb(Graphicsg)...{
Graphics2Dg2d
=(Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
//填充椭圆框为当前thumb位置
g2d.fillOval(thumbRect.x,thumbRect.y,thumbRect.width,
thumbRect.height);
//也可以帖图(利用鼠标事件转换image即可体现不同状态)
//g2d.drawImage(image,thumbRect.x,thumbRect.y,thumbRect.width,thumbRect.height,null);
}


/***//**
*绘制刻度轨迹
*/

publicvoidpaintTrack(Graphicsg)...{
intcy,cw;
RectangletrackBounds
=trackRect;
if(slider.getOrientation()==JSlider.HORIZONTAL)...{
Graphics2Dg2
=(Graphics2D)g;
cy
=(trackBounds.height/2)-2;
cw
=trackBounds.width;

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.translate(trackBounds.x,trackBounds.y
+cy);

//背景设为灰色
g2.setPaint(Color.GRAY);
g2.fillRect(
0,-cy,cw,cy*2);

inttrackLeft=0;

inttrackRight=0;

trackRight
=trackRect.width-1;

intmiddleOfThumb=0;

intfillLeft=0;

intfillRight=0;

//坐标换算
middleOfThumb=thumbRect.x+(thumbRect.width/2);
middleOfThumb
-=trackRect.x;

if(!drawInverted())...{
fillLeft
=!slider.isEnabled()?trackLeft:trackLeft+1;
fillRight
=middleOfThumb;
}
else...{
fillLeft
=middleOfThumb;
fillRight
=!slider.isEnabled()?trackRight-1
:trackRight
-2;
}

//设定渐变
g2.setPaint(newGradientPaint(0,0,newColor(0,100,100),cw,0,
newColor(0,255,100),true));
g2.fillRect(
0,-cy,fillRight-fillLeft,cy*2);

g2.setPaint(slider.getBackground());
Polygonpolygon
=newPolygon();
polygon.addPoint(
0,cy);
polygon.addPoint(
0,-cy);
polygon.addPoint(cw,
-cy);
g2.fillPolygon(polygon);
polygon.reset();

g2.setPaint(Color.WHITE);
g2.drawLine(
0,cy,cw-1,cy);

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_OFF);
g2.translate(
-trackBounds.x,-(trackBounds.y+cy));
}
else...{
super.paintTrack(g);
}

}

}



效果图:
分享到:
评论

相关推荐

    javaAWT组件JSlider应用

    javaAWT组件JSlider应用javaAWT组件JSlider应用javaAWT组件JSlider应用

    java 简单的JSlider

    该java程序采用良好格式,美观的界面,简单易懂

    Java Swing JSlider滑块的实现示例

    主要介绍了Java Swing JSlider滑块的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java swing-JSlider的使用

    JSlider是Swing库提供的一个用于选择范围值的滑动条组件。它允许用户在指定的最小和最大值之间进行滑动来选择一个值。

    jslider中一些运用

    jslier滑动条的重写即运用

    Java Swing实例源码包.rar

    Java Swing实例源码包,包括了JComboBox 、Border、JList、JMenu、JSlider、JTabbedPane、JTable、JToolTip、JTree等常用Swing组件的用法示例,对Java编写界面来说,Swing确实是个不错的选择,希望这些示例能让你更...

    Java实现图片旋转功能.rar

    Java实现图片旋转功能,基本上是图像缓冲区、过滤图像,重载容器,重绘组件,仿射变换对象,创建仿射变换操作对象,让用于显示的缓冲区图像指向过滤后的图像等的操作,可了解下Java如何处理图像数据的。部分代码如下...

    Java实现图片透明效果.rar

    Java实现图片透明效果,从演示截图可看到,上层图片与下层图片互相重叠,也就是上层图片透明了,看到了下层以的图片,具体的代码实现:  public class HalfTransparentImageDemo extends JFrame {   private ...

    jquery jSlider

    jquery开发的拖动条,jquery开发的拖动条,jquery开发的拖动条,挺漂亮的。

    Java图片旋转_java_

    Java图片旋转,使用Java语言编写程序,旋转图像文件,用到了滑动条jSlider事件处理技术,得到旋转角度(弧度制)

    疯狂JAVA讲义

    10.4.2 自定义异常类 371 10.4.3 catch和throw同时使用 371 10.4.4 异常链 373 10.5 Java的异常跟踪栈 374 10.6 异常处理规则 376 10.6.1 不要过度使用异常 377 10.6.2 不要使用过于庞大的try块 378 10.6.3 ...

    SWING教學-JSlider 元件的使用

    JSlider教學 SWING 的元件,JSlider, 是在視窗介面設計時非常好用的元件。JSlider,基本概念的介紹,需要有Swing及Event Handling的概念。

    jSlider:jQuery滑块插件

    #jSlider jQuery响应式滑块插件用法: 文件和upack 到您的项目目录中。 将jQuery库和jSlider.js包含到index.html文件中 [removed][removed] [removed][removed]在主样式表文件之后,将jSlider.css包括在index.html...

    Java图片旋转程序实例

    Java图片旋转,使用Java语言编写程序,旋转图像文件,期间用到了滑动条jSlider事件处理技术,得到旋转角度(弧

    JAva拖动滑块旋转图片.rar

    JAva拖动滑块旋转图片,拖动滑块可改变图片 旋转的角度,可学习下滑块取值赋值的技巧。部分代码如下:  super("图像旋转演示"); //调用父类构造函数  jSlider.setPaintTicks(true); //绘制标志位  jSlider....

    java-swing-alphaslider:AlphaSlider 的 Java Swing 实现

    这与仅处理数值的 Java Swing JSlider 类形成对比。 建造 使用以下命令通过 Maven 构建 AlphaSlider: mvn clean compile 要创建 JAR 文件,请使用以下命令: mvn package 如果要将 AlphaSlider JAR 添加到 ...

    Java滑块制作的调色板程序.rar

    Java使用滑块制作的调色板程序,本源码演示一个基于RGB 的调色板程序,当调节各个代表不同颜色数值的JSlider 滑块组件时,窗口上部的颜色将随之变化。

    在窗体中实现滑块拖动-Java应用程序代码.rar

    Java版在窗体中实现滑块拖动的代码,相信这个功能大家应用熟悉,拖动滑块在滑杆上移动,可改变预设置,可应用于多种环境下。  super("滑杆演示"); //调用父类构造函数  panel=new GraphPanel(); //实例化面板 ...

    Java典型模块

    第1篇 Java开发必备基础 第1章 搭建Java开发环境 1.1 Java的过去、现在和未来 1.1.1 Java的历史 1.1.2 Java的语言特点 1.1.3 Java API简介 1.1.4 Java未来发展 1.2 Java程序设计环境 1.2.1 命令行工具——JDK 6.0 ...

Global site tag (gtag.js) - Google Analytics