版权声明:本文为博主原创文章,转载请注明出处
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; } } }