改变 JSlider 的外观和感觉
Posted
技术标签:
【中文标题】改变 JSlider 的外观和感觉【英文标题】:Change the JSlider look and feel 【发布时间】:2012-08-30 21:55:16 【问题描述】:我浏览过这个网站Change look and feel of JSlider
但除了Slider.altTrackColor
没有其他工作。我想做一些如图 1 所示的事情,任何建议都会有很大帮助。我正在开发 JDK 1.6。
UIDefaults defaults = UIManager.getDefaults();
defaults.put("Slider.altTrackColor", Color.red);
defaults.put("Slider.thumb", Color.red);
我也试过这个:
WindowUtilities.setNativeLookAndFeel();
// WindowUtilities.setNimbuzzLookAndFeel();
// WindowUtilities.setJavaLookAndFeel();
WindowUtilities 是告诉系统使用本机外观和感觉的类,就像在以前的版本中一样。否则,Metal (Java) LAF 是默认设置。
public static void setNativeLookAndFeel()
try
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
catch(Exception e)
System.out.println("Error setting native LAF: " + e);
【问题讨论】:
下次我会记住这一点。谢谢指正 顺便说一句-WindowUtilities
是什么? DYMSwingUtilities
?为了尽快获得更好的帮助,请发帖SSCCE。
@AndrewThompson its a class /** 告诉系统使用本机外观,就像以前的 * 版本一样。否则,Metal (Java) LAF 是默认设置。 */
将其包含在 SSCCE 中。
【参考方案1】:
这是第一张图片中显示的工作 UI 的完整示例: (没有魔法 - 只需要一点图形和基本的 UI 知识)
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.geom.GeneralPath;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.plaf.basic.BasicSliderUI;
/**
*
* @see http://***.com/a/12297384/714968
*/
public class CustomSliderUI extends BasicSliderUI
private BasicStroke stroke = new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 0f, new float[]1f, 2f, 0f);
public CustomSliderUI(JSlider b)
super(b);
@Override
public void paint(Graphics g, JComponent c)
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
super.paint(g, c);
@Override
protected Dimension getThumbSize()
return new Dimension(12, 16);
@Override
public void paintTrack(Graphics g)
Graphics2D g2d = (Graphics2D) g;
Stroke old = g2d.getStroke();
g2d.setStroke(stroke);
g2d.setPaint(Color.BLACK);
if (slider.getOrientation() == SwingConstants.HORIZONTAL)
g2d.drawLine(trackRect.x, trackRect.y + trackRect.height / 2,
trackRect.x + trackRect.width, trackRect.y + trackRect.height / 2);
else
g2d.drawLine(trackRect.x + trackRect.width / 2, trackRect.y,
trackRect.x + trackRect.width / 2, trackRect.y + trackRect.height);
g2d.setStroke(old);
@Override
public void paintThumb(Graphics g)
Graphics2D g2d = (Graphics2D) g;
int x1 = thumbRect.x + 2;
int x2 = thumbRect.x + thumbRect.width - 2;
int width = thumbRect.width - 4;
int topY = thumbRect.y + thumbRect.height / 2 - thumbRect.width / 3;
GeneralPath shape = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
shape.moveTo(x1, topY);
shape.lineTo(x2, topY);
shape.lineTo((x1 + x2) / 2, topY + width);
shape.closePath();
g2d.setPaint(new Color(81, 83, 186));
g2d.fill(shape);
Stroke old = g2d.getStroke();
g2d.setStroke(new BasicStroke(2f));
g2d.setPaint(new Color(131, 127, 211));
g2d.draw(shape);
g2d.setStroke(old);
public static void main(String[] args)
JFrame frame = new JFrame();
JSlider slider = new JSlider(0, 100);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setMinorTickSpacing(5);
slider.setMajorTickSpacing(25);
slider.setUI(new CustomSliderUI(slider));
frame.add(slider);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
您可以通过更改返回的边界轻松地修改拇指(抓手)的大小。拇指画将适应任何尺寸。您还可以轻松自定义任何其他滑块部分的绘画。
顺便说一下,这是最终视图:
附:我没有为垂直滑块调整 UI,但这应该不会花费太长时间。
【讨论】:
以上是关于改变 JSlider 的外观和感觉的主要内容,如果未能解决你的问题,请参考以下文章