滑杆组件的应用实例
滑杆JSlider类是让用户能够通过滑块的滑动来改变选择值的组件。
与JLabel、JButton相似,JSlider也可以作为小组件放置在面板上。下面以用滑杆改变颜色使画出的图像动态变化为例,说明滑杆的使用。
在这个程序中,我们需要4个类:一个面板类三个监听器类。
面板类:
面板最好分成左右两块,左边放置需要的小组件(按钮、标签、滑杆),右边作为绘画区域。
动作监听器ActionListener:
用来监听按钮,获得按钮文本,从而判断要进行的操作。在这里由于动作监听器所需要完成的功能很少,也可以将其作为一个内部类放置在面板类中。
鼠标监听器MouseListener:
用来监听右边面板实现绘图操作,获取鼠标按下和释放点的坐标,并据此画出图形。
ChangeListener:
用来监听滑杆滑块移动,其中的stateChanged(ChangeEvent e) 方法用来实现滑块移动后进行的操作。
在该方法中需要获得上一次画图形的起始位置,然后根据按钮文本来判断上一次画的是什么图形,接着将画笔颜色设为滑杆显示的数值,重复鼠标监听器中的画图形方法即可。
面板类SimplePanel:
import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Graphics;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JSlider;/** * 简单画板,实现画线,画圆,画矩形,清除痕迹,颜色选择功能 */public class SimplePanel extends JFrame{public Graphics g;public JPanel jpChose;//按钮选择面板public JPanel jpDraw;//画图面板public JButton jOval;//渐变圆public JButton jRect;//渐变矩形public JButton jClear;//自定义橡皮擦public JLabel red;//标签 红色public JLabel green;//标签 绿色public JLabel blue;//标签 蓝色public JSlider jRed;//滑杆 红色public JSlider jBlue;//滑杆 蓝色public JSlider jGreen;//滑杆 绿色public static void main(String args[]){SimplePanel sp = new SimplePanel();sp.init();}/** * 初始化面板类 */public void init(){//设置面板属性this.setTitle("简单画板");this.setSize(800, 700);this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);//设置边框布局this.setLayout(new BorderLayout());/*-----------------选择面板.西边----------------------*/jpChose = new JPanel();jpChose.setPreferredSize(new Dimension(200,700));jpChose.setLayout(new FlowLayout());jOval = new JButton("Oval");jRect = new JButton("Rect");jClear = new JButton("Clear");jOval.setPreferredSize(new Dimension(170,28));jRect.setPreferredSize(new Dimension(170,28));jClear.setPreferredSize(new Dimension(170,28));red = new JLabel("Red");green = new JLabel("Green");blue = new JLabel("Blue");jRed = new JSlider();jGreen = new JSlider();jBlue = new JSlider();//设置滑杆的各种属性this.setSlider();//向面板添加按钮jpChose.add(jOval);jpChose.add(jRect);jpChose.add(jClear);//向面板添加标签和滑杆jpChose.add(red);jpChose.add(jRed);jpChose.add(green);jpChose.add(jGreen);jpChose.add(blue);jpChose.add(jBlue);//添加动作监听器,获得按钮文本ButtonL bl = new ButtonL();jOval.addActionListener(bl);jRect.addActionListener(bl);jClear.addActionListener(bl);this.add(jpChose, BorderLayout.WEST);/*-----------------选择面板.西边----------------------*//*-----------------绘图面板.中央----------------------*/jpDraw = new JPanel();this.add(jpDraw, BorderLayout.CENTER);/*-----------------绘图面板.中央----------------------*/this.setVisible(true);g = jpDraw.getGraphics();//鼠标监听器,根据鼠标起始位置画图形MouseL ml = new MouseL(g,jRed,jGreen,jBlue);jpDraw.addMouseListener(ml);//ChangeListener当移动滑杆上的滑块时,刚画过图形的颜色动态改变SliderL sl = new SliderL(g,jRed,jGreen,jBlue,ml);jRed.addChangeListener(sl);jGreen.addChangeListener(sl);jBlue.addChangeListener(sl);}/** * 设置滑杆属性方法 */private void setSlider() {//红jRed.setMaximum(256);//设置最大值jRed.setMajorTickSpacing(64);//设置主刻度标记的间隔jRed.setMinorTickSpacing(16);//设置次刻度标记的间隔jRed.setPaintLabels(true);//确定是否在滑块上绘制标签jRed.setPaintTicks(true);// 确定是否在滑块上绘制刻度标记jRed.setValue(120);//设置初始值//绿jGreen.setMaximum(256);jGreen.setMajorTickSpacing(64);jGreen.setMinorTickSpacing(16);jGreen.setPaintLabels(true);jGreen.setPaintTicks(true);jGreen.setValue(130);//蓝jBlue.setMaximum(256);jBlue.setMajorTickSpacing(64);jBlue.setMinorTickSpacing(16);jBlue.setPaintLabels(true);jBlue.setPaintTicks(true);jBlue.setValue(150);}} import java.awt.event.ActionEvent;import java.awt.event.ActionListener;/** * 用来获得按钮上文本的类,也可以写为内部类 */public class ButtonL implements ActionListener{public static String s="null";public void actionPerformed(ActionEvent e) {s = e.getActionCommand();}}import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JSlider;/** * 鼠标监听器,实现图形的绘制 */public class MouseL implements MouseListener {Graphics g;public int x1, y1, x2, y2;public JSlider jRed;public JSlider jBlue;public JSlider jGreen;public int red;public int green;public int blue;/** * 重载构造方法 * @param g画布,用来绘图 * @param jRed滑杆,用来获得颜色初始值 * @param jBlue滑杆,用来获得颜色初始值 * @param jGreen滑杆,用来获得颜色初始值 */public MouseL(Graphics g, JSlider jRed, JSlider jGreen, JSlider jBlue) {this.g = g;this.jRed = jRed;this.jGreen = jGreen;this.jBlue = jBlue;}/** * 按下鼠标,获得按下点的坐标并设置颜色为滑杆的初始颜色 */public void mousePressed(MouseEvent e) {x1 = e.getX();y1 = e.getY();red = jRed.getValue();green = jGreen.getValue();blue = jBlue.getValue();g.setColor(new Color(red, green, blue));}/** * 鼠标释放时,获取释放点的坐标,根据按钮的文本画出相应的图形 */public void mouseReleased(MouseEvent e) {x2 = e.getX();y2 = e.getY();String str = ButtonL.s;if (str.equals("Clear")) {g.clearRect(x1, y1, x2 - x1, y2 - y1);}//在这里采用的是向图形中心渐变的方法,也可以改变调用画图方法是传入的参数,实现更多种的变幻for (int i = 0; i < 150; i+=3) {if (str.equals("Oval")) {//画渐变圆g.fillOval(x1 + i, y1 + i, x2 - x1 - i*2, y2 - y1 - i*2);} else if (str.equals("Rect")) {//画渐变矩形g.fillRect(x1 + i, y1 + i, x2 - x1 - i*2, y2 - y1 - i*2);} red = red - 2;green-=2;blue-=2;g.setColor(new Color(red,green,blue));}}public void mouseClicked(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}}import java.awt.Color;import java.awt.Graphics;import javax.swing.JSlider;import javax.swing.event.ChangeEvent;import javax.swing.event.ChangeListener;/** * 加在滑杆上的监听器,当任意滑杆上的滑块移动时,在先前画图形的位置用改变后的颜色将图形重画 */public class SliderL implements ChangeListener{public Graphics g;public JSlider jRed;public JSlider jBlue;public JSlider jGreen;public int red;public int green;public int blue;public MouseL ml;public int x1;public int y1;public int x2;public int y2;/** * 重载构造方法 * @param g画布,每移动一下滑块,都需在原来的位置画出一个颜色改变的图形 * @param jRed滑杆,获得改变后的颜色值 * @param jBlue滑杆,获得改变后的颜色值 * @param jGreen滑杆,获得改变后的颜色值 * @param ml鼠标监听器,获得画图的坐标 */public SliderL(Graphics g,JSlider jRed,JSlider jGreen , JSlider jBlue,MouseL ml){this.g = g;this.jRed = jRed;this.jGreen = jGreen;this.jBlue = jBlue;this.ml = ml;}/** * 滑块移动,改变颜色,重画图形 */public void stateChanged(ChangeEvent e) {x1 = ml.x1;y1 = ml.y1;x2 = ml.x2;y2 = ml.y2;red = jRed.getValue();green = jGreen.getValue();blue = jBlue.getValue();g.setColor(new Color(red,green,blue));String str = ButtonL.s;if (str.equals("Clear")) {g.clearRect(x1, y1, x2 - x1, y2 - y1);}for (int i = 0; i < 150; i+=3) {if (str.equals("Oval")) {g.fillOval(x1 + i, y1 + i, x2 - x1 - i*2, y2 - y1 - i*2);} else if (str.equals("Rect")) {g.fillRect(x1 + i, y1 + i, x2 - x1 - i*2, y2 - y1 - i*2);} red = red - 2;green-=2;blue-=2;g.setColor(new Color(red,green,blue));}}}
