Java自定義JSlider UI

Java自定義JSlider UI
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>
?*?
?*?
@author?chenpeng
?*?@email:ceponline@yahoo.com.cn
?*?
@version?0.1
?
*/

public?class?ExampleSlider?extends?JPanel?...{
????
/**?*//**
?????*?
?????
*/

????
private?static?final?long?serialVersionUID?=?1L;

????
public?ExampleSlider()?...{
????????
//?設定布局器
????????super(new?BorderLayout());
????????
//?設定監聽器
????????ChangeListener?listener?=?new?ChangeListener()?...{
????????????
public?void?stateChanged(ChangeEvent?e)?...{
????????????????
if?(e.getSource()?instanceof?JSlider)?...{
????????????????????System.out.println(
"刻度:?"
????????????????????????????
+?((JSlider)?e.getSource()).getValue());
????????????????}

????????????}

????????}
;
????????
//?設定JSlider1
????????JSlider?s1?=?new?JSlider(0,?100,?0);
????????
//?注入自定義ui
????????s1.setUI(new?MySliderUI());
????????
//?主刻度
????????s1.setMajorTickSpacing(10);
????????
//?次刻度
????????s1.setMinorTickSpacing(5);
????????
//?設定為顯示
????????s1.setPaintTicks(true);
????????s1.setPaintLabels(
true);
????????
//?監聽slider1
????????s1.addChangeListener(listener);
????????
//?設定JSlider2
????????JSlider?s2?=?new?JSlider(0,?100,?0);
????????
//?使用MetalSliderUI為ui
????????s2.setUI(new?javax.swing.plaf.metal.MetalSliderUI()?...{
????????????
protected?void?paintHorizontalLabel(Graphics?g,?int?v,?Component?l)?...{
????????????????JLabel?lbl?
=?(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);

????????
//使用盒式容器
????????Box?box?=?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(new?Dimension(240,?100));
????}


????
public?static?void?main(String[]?args)?...{
????????EventQueue.invokeLater(
new?Runnable()?...{
????????????
public?void?run()?...{
????????????????createUI();
????????????}

????????}
);
????}


????
public?static?void?createUI()?...{
????????JFrame?frame?
=?new?JFrame("音量刻度設置");
????????frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
????????frame.getContentPane().add(
new?ExampleSlider());
????????frame.setResizable(
false);
????????frame.pack();
????????
//居中
????????frame.setLocationRelativeTo(null);
????????frame.setVisible(
true);
????}

}


class?MySliderUI?extends?javax.swing.plaf.metal.MetalSliderUI?...{
????
/**?*//**
?????*?繪制指示物
?????
*/

????
public?void?paintThumb(Graphics?g)?...{
????????Graphics2D?g2d?
=?(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);
????}


????
/**?*//**?
?????*?繪制刻度軌跡
?????
*/

????
public?void?paintTrack(Graphics?g)?...{
????????
int?cy,?cw;
????????Rectangle?trackBounds?
=?trackRect;
????????
if?(slider.getOrientation()?==?JSlider.HORIZONTAL)?...{
????????????Graphics2D?g2?
=?(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);

????????????
int?trackLeft?=?0;

????????????
int?trackRight?=?0;

????????????trackRight?
=?trackRect.width?-?1;

????????????
int?middleOfThumb?=?0;

????????????
int?fillLeft?=?0;

????????????
int?fillRight?=?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(new?GradientPaint(0,?0,?new?Color(0,?100,?100),?cw,?0,
????????????????????
new?Color(0,?255,?100),?true));
????????????g2.fillRect(
0,?-cy,?fillRight?-?fillLeft,?cy?*?2);

????????????g2.setPaint(slider.getBackground());
????????????Polygon?polygon?
=?new?Polygon();
????????????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);
????????}

????}

}



效果圖:
posted on 2007-12-18 14:05 cping 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/cping1982/archive/2007/12/18/2258085.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276980.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Chrome OS 云里霧里

昨天Google發布了ChromeOS&#xff0c;之前有牛人編譯了它的源碼并創建了虛擬機分享出來。具體的BT種子不記得了&#xff0c;有需要的可以搜索一下chromeos-image-999.999.32309.211410-a1.vmdk.bz2。看看哪還有種子可用。文件大概287M左右&#xff0c;解壓后大概7、8百M。當下…

C++基礎學習一(基礎之基礎)

開篇&#xff1a;做了這么多年的軟件&#xff0c;第一次使用博客的方式記錄學習過程&#xff0c;之前都是筆記本&#xff08;都有一摞了&#xff09;&#xff0c;因為之前一直從事的都是.NET的開發工作&#xff0c;對C知之甚少&#xff0c;但一直想了解C這門鼻祖級的語言&#…

二叉樹的遍歷方式

2019獨角獸企業重金招聘Python工程師標準>>> 二叉樹遍歷方式有三種&#xff1a;前序遍歷&#xff0c;中序遍歷&#xff0c;后序遍歷&#xff08;其實還有一個層序遍歷&#xff09; 使用兩種方式來實現三種遍歷&#xff1a; 1. 使用遞歸的方式實現 1&#xff09;&…

非常惡俗地分享一首歌曲(子陵·周郎顧)

歌詞 [hjp3]hjptypesong&player5&filehttp://file.hjbbs.com/ayi/share/mp3/zhoulanggu.mp3&backColor990000&frontColorddddff&autoStarttrue&showDownloadtrue&width310&height20[/hjp3]子陵周郎顧 綠綺輕拂剎那玄冰破&#xff0c; 九霄仙音…

that is why用法

釋義&#xff1a;這就是為什么&#xff0c;因此 Thats why I was getting married. ---《老友記》 第一季 第一集 這就是我為什么結婚的原因。 例句&#xff1a; Mr. Gorbachev, on the other hand, recognized that his sluggish and authoritarian bureaucracy was the worst…

阿里云超算集諦優化GPU異構并行性能:GROMACS

“集諦”是一款內置于阿里云彈性高性能計算(Elastic High Performance Computing&#xff0c;E-HPC)的云上性能監控與分析引擎&#xff0c;支持集群資源利用情況的實時監控和用戶作業運行情況的在線分析。對于采用GPU加速的異構計算應用場景&#xff0c;“集諦”除了監控節點ho…

日本常用網址

1.Yahoo&#xff01;Japan http://www.yahoo.co.jp 2.價格.com http://www.kakaku.com 購買商品前必看的網站&#xff0c;不僅僅是為了得到相對最低的價格信息&#xff0c;更重要的是獲取關于同類商品不同品牌型號的評價和比較。 3.樂天 http://www.rakuten.co.jp 日本最…

MySQl看這一篇就夠了

MySQl看這一篇就夠了 MySQL分享 一、數據庫結構 語句 DDL&#xff08;Data Definition Languages&#xff09;&#xff1a;數據定義語句&#xff0c;常用的語句關鍵字主要包括 create、drop、alter等操作表結構 DML&#xff08;Data Manipulation Language&#xff09;&#xf…

IDEA 實用功能Auto Import:自動優化導包(自動刪除、導入包)

JetBrains公司的intellij Idea堪稱JAVA編程界的蘋果&#xff0c;用戶體驗非常好 下面介紹一下IDEA的一個能顯著提升寫代碼效率的非常好用的功能設置—— Auto Import Auto Import的功能是可以幫助我們自動刪除無用的包Import(未被引用)&#xff0c;以及自動Import填充尚未導入的…

怎么看網站是否被黑防止網站被黑

2019獨角獸企業重金招聘Python工程師標準>>> 網站被黑&#xff0c;打開網站竟然跳轉到博cai網站上去了&#xff0c;一開始以為自己看錯了&#xff0c;多次從百度點擊自己網站進去&#xff0c;還是會跳轉到彩piao網站上&#xff0c;第一反應是自己的網站被黑了&#…

c#事務的使用、示例及注意事項

一、事務的介紹.NET Framework 開發員指南事務是一組組合成邏輯工作單元的操作&#xff0c;雖然系統中可能會出錯&#xff0c;但事務將控制和維護事務中每個操作的一致性和完整性。例如&#xff0c;在將資金從一個帳戶轉移到另一個帳戶的銀行應用中&#xff0c;一個帳戶將一定的…

鏡像服務器文件實時監控同步程序

這是為我們網站解決南北電信網通互聯互通問題而寫的一個程序。 優游中國(www.yooyocn.com)是一個大型旅游門戶網站&#xff0c;提供了資訊&#xff0c;視頻&#xff0c;圖片&#xff0c;博客&#xff0c;論壇等大數據量的業務內容。 為了使全國各地的網友都能夠快速訪問我們的網…

Nginx學習系列二Linux下Nginx實現負載均衡

關于在本地虛擬機(VMware 14)下安裝Linux同時安裝Nginx,請參考Nginx學習系列之搭建環境 1、啟動Nginx 在Nginx安裝成功的前提下,啟動Nginx 已root模式登陸(權限需要),接著找到Nginx的安裝目錄,啟動Nginx,并且指定Nginx啟動所需的配置文件,該文件也在Nginx的安裝目錄下. 2、查看…

FastCGI中文規范

http://fuzhong1983.blog.163.com/blog/static/1684705201051002951763/ . 介紹 FastCGI是對CGI的開放的擴展&#xff0c;它為所有因特網應用提供高性能&#xff0c;且沒有Web服務器API的缺點&#xff08;penalty&#xff09;。 本規范具有有限的&#xff08;narrow&#xff09…

設計模式初學者系列-策略模式 -------為什么總是繼承

設計模式初學者系列&#xff0d;策略模式 -------為什么總是繼承 模板方法的延續 這篇稿子是基于我的前一篇模板方法設計模式之上演繹的&#xff0c;如果沒有閱讀請點擊這里查看&#xff0c;以了解這篇稿子的上下文。 在模板方法設計模式里我舉了一個例子&#xff1a;教育部…

紅米airdots掉了怎么查找_紅米K30 Pro 榮耀V30pro 這兩款手機該怎么選呢?

點擊?玩機數碼君?關注我&#xff0c;加★星標★你好 我是歲月神偷昨天可以說是小米拍手稱快的一天&#xff0c;紅米K30 Pro以2999的超低價成為目前最便宜的驍龍865旗艦&#xff0c;讓友商拍馬難追。友商明眼人都知道說的華為&#xff0c;怎么感覺小米每次發布會也替華為宣傳了…

返回一個循環整數組最大子數組和

任務要求&#xff1a; 1、輸入一個整形數組&#xff0c;數組里有正數也有負數。 2、數組中連續的一個或多個整數組成一個子數組&#xff0c;每個子數組都有一個和。 3、如果數組A[0]……A[j-1]首尾相鄰&#xff0c;允許A[i-1]&#xff0c; …… A[n-1]&#xff0c; A[0]……A…

中文分詞入門之字標注法4

http://www.52nlp.cn/%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%85%A5%E9%97%A8%E4%B9%8B%E5%AD%97%E6%A0%87%E6%B3%A8%E6%B3%954 上一節主要介紹的是利用最大熵工具包來做字標注中文分詞&#xff0c;這一節我們直奔主題&#xff0c;借用條件隨機場工具“CRF: Yet Another CRF …

后臺設置 datakeynames

FormView2.DataKeyNames new String[] { "ShoppingRemarkID" }; 轉載于:https://www.cnblogs.com/Fernando/archive/2008/01/16/1041717.html

4K 海思 聯詠 芯片_老電視也有春天,換裝海美迪4K電視盒子H7 Plus

寫在前面YALL&#xff0c;大家好&#xff0c;我是老炮兒許老板。疫情進入六月逐漸好轉&#xff0c;各級各類學校相繼開學&#xff0c;年前給兒子報的托班也終于迎來了開學&#xff0c;平日里幫忙照看兒子的爺爺奶奶也終于得到了解放。現在白天有大把大把的時間來追劇看電視&…