Java自定义JSlider UI

xiaoxiao2021-03-01  47

JSlider作为Swing中提供的滑标组件, 以图形方式在有界区间内通过移动滑块来选择值,滑块可以显示主刻度标记和次刻度标记。大量应用于如播放器中的音量设定等领域中。 但是JSlider本身提供的UI样式很单调,不足以满足用户的审美需求,往往需要我们自行重构其UI。 下面我给出一个简单的例子。 package org.loon.framework.swing.test; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.RenderingHints; import javax.swing.Box; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.WindowConstants; import javax.swing.event.ChangeEvent; import javax.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*/ public class ExampleSlider extends JPanel ... {/***//****/privatestaticfinallongserialVersionUID=1L;publicExampleSlider()...{//设定布局器super(newBorderLayout());//设定监听器ChangeListenerlistener=newChangeListener()...{publicvoidstateChanged(ChangeEvente)...{if(e.getSource()instanceofJSlider)...{System.out.println("刻度:"+((JSlider)e.getSource()).getValue());}}};//设定JSlider1JSliders1=newJSlider(0,100,0);//注入自定义uis1.setUI(newMySliderUI());//主刻度s1.setMajorTickSpacing(10);//次刻度s1.setMinorTickSpacing(5);//设定为显示s1.setPaintTicks(true);s1.setPaintLabels(true);//监听slider1s1.addChangeListener(listener);//设定JSlider2JSliders2=newJSlider(0,100,0);//使用MetalSliderUI为uis2.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);}} class MySliderUI extends javax.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);}}} 效果图: 相关资源:微信小程序源码-合集3.rar
转载请注明原文地址: https://www.6miu.com/read-4550104.html

最新回复(0)