在窗口中设置三个“圆形”“扇形”“矩形”按钮,点击按钮,将图形变为相应的形状(实心),设置三个“红色”“绿色”“蓝色”滚动条,滑动滚动条变换图形的颜色,设置一个控制左右移动的滚动条,点击滚动条变换图形

 
 
 
 

版权声明:本文为博主原创文章,转载请注明出处

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Dictionary;
import java.util.Hashtable;

public class Main {
	

    public static void main(String[] args) {
        /*
         * 在 AWT 的事件队列线程中创建窗口和组件, 确保线程安全,
         * 即 组件创建、绘制、事件响应 需要处于同一线程。
         */
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                // 创建窗口对象
                MyFrame frame = new MyFrame();
                // 显示窗口
                frame.setVisible(true);
            }
        });
    }

    /**
     * 窗口
     */
    public static class MyFrame extends JFrame {

        public static final String TITLE = "Java图形绘制";

        public static final int WIDTH = 500;
        public static final int HEIGHT = 400;

        public MyFrame() {
            super();
            initFrame();
        }

        private void initFrame() {
            // 设置 窗口标题 和 窗口大小
            setTitle(TITLE);
            setSize(WIDTH, HEIGHT);

            // 设置窗口关闭按钮的默认操作(点击关闭时退出进程)
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

            // 把窗口位置设置到屏幕的中心
            setLocationRelativeTo(null);
            
            
            JPanel main = new JPanel(new BorderLayout());
            final MyPanel pic = new MyPanel(Color.BLACK,80,-1,0);
            main.add(pic,BorderLayout.CENTER);
            
            JPanel btn_panel = new JPanel(new GridLayout(3, 3));
            JButton btn_circle = new JButton("圆形");
            btn_circle.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					pic.setType(0);
					pic.updateUI();
				}
			});
            JButton btn_sx = new JButton("扇形");
            btn_sx.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					System.out.println("扇形");
					pic.setType(1);
					pic.updateUI();
				}
			});
            JButton btn_rec = new JButton("矩形");
            btn_rec.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					pic.setType(2);
					pic.updateUI();
				}
			});
            
            JButton btn_red = new JButton("红色");
            btn_red.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					pic.setColor(Color.RED);
					pic.updateUI();
				}
			});
            
            JButton btn_green = new JButton("绿色");
            btn_green.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					pic.setColor(Color.GREEN);
					pic.updateUI();
				}
			});
            
            JButton btn_blue = new JButton("蓝色");
            btn_blue.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					pic.setColor(Color.BLUE);
					pic.updateUI();
				}
			});
            JButton btn_plus = new JButton("变大");
            btn_plus.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					pic.setSize(150);
					pic.updateUI();
				}
			});
            JButton btn_small = new JButton("变小");
            btn_small.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					pic.setSize(50);
					pic.updateUI();
				}
			});
            
            btn_panel.add(btn_circle);
            btn_panel.add(btn_sx);
            btn_panel.add(btn_rec);
            btn_panel.add(btn_red);
            btn_panel.add(btn_green);
            btn_panel.add(btn_blue);
            btn_panel.add(btn_plus);
            btn_panel.add(btn_small);
            main.add(btn_panel,BorderLayout.NORTH);
            
            JSlider slider = new JSlider(JSlider.VERTICAL,0,2,1);
            slider.setPaintTicks(true);
            slider.setSnapToTicks(true);// 设置滚动条只停留在有刻度的地方
            slider.setMinorTickSpacing(1);
            slider.setMajorTickSpacing(1);
            slider.setPaintLabels(true);
            slider.setInverted(true);
            Dictionary<Integer, Component> labels = new Hashtable<Integer, Component>();
            labels.put(0, new JLabel("红色"));
            labels.put(1, new JLabel("绿色"));
            labels.put(2, new JLabel("蓝色"));
            slider.setLabelTable(labels);
            slider.addChangeListener(new ChangeListener() {
    			@Override
    			public void stateChanged(ChangeEvent e) {
    				JSlider source = (JSlider)e.getSource();
    				switch(source.getValue()){
    				case 0:pic.setColor(Color.RED);break;
    				case 1:pic.setColor(Color.GREEN);break;
    				case 2:pic.setColor(Color.BLUE);break;
    				}
    				pic.updateUI();
    			}
    		});
            main.add(slider,BorderLayout.EAST);
            
            
            JSlider slider2 = new JSlider(JSlider.HORIZONTAL,0,250,1);
            slider2.setPaintTicks(true);
            slider2.setSnapToTicks(true);// 设置滚动条只停留在有刻度的地方
            slider2.setPaintLabels(true);
            slider2.addChangeListener(new ChangeListener() {
    			@Override
    			public void stateChanged(ChangeEvent e) {
    				JSlider source = (JSlider)e.getSource();
    				int sub = source.getValue();
    				pic.setSub(sub);
    				pic.updateUI();
    			}
    		});
            main.add(slider2,BorderLayout.SOUTH);
            setContentPane(main);
        }

    }

    /**
     * 内容面板
     */
    public static class MyPanel extends JPanel {
    	
    	private Color color;
    	private int size;
    	private int type;
    	private int sub;
    	
        public MyPanel(Color color,int size,int type,int sub) {
        	this.color = color;
        	this.size = size;
        	this.type = type;
        	this.sub = sub;
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            draw(g,type);
        }

        
        private void draw(Graphics g,int type){
        	if(type == 0){
        		drawCircle(g, color);
        	}else if(type == 1){
        		drawArc(g, color);
        	}else if(type == 2){
        		drawRect(g, color);
        	}
        }
        
        private void drawCircle(Graphics g,Color color){
        	  Graphics2D g2d = (Graphics2D) g.create();
              g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
              g2d.setColor(color);
              // 2. 绘制一个圆: 圆的外切矩形 左上角坐标为(120, 20), 宽高为100
              g2d.fillArc(30+ sub, 20, size, size, 0, 360);
              g2d.dispose();
        }
        
        /**
         * 2. 矩形 / 多边形
         */
        private void drawRect(Graphics g,Color color) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(color);
            g2d.fillRect(30+ sub, 20, size, size+20);
            g2d.dispose();
        }

        /**
         * 3. 圆弧 / 扇形
         */
        private void drawArc(Graphics g,Color color) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(color);
            // 3. 填充一个扇形
            g2d.fillArc(30 + sub, 20, size, size, 90, 170);
            g2d.dispose();
        }
        
		public void setColor(Color color) {
			this.color = color;
		}

		public void setSize(int size) {
			this.size = size;
		}

		public void setType(int type) {
			this.type = type;
		}
		
		public void setSub(int sub){
			this.sub = sub;
		}
        
    }

}

猜你喜欢

转载自blog.csdn.net/cyy298/article/details/80928577