A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴清源 中级黑马   /  2013-10-8 20:21  /  1276 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

重写Jlabel类的paint()方法实现标签图片的倾斜显示
  1. import java.awt.BorderLayout;
  2. import java.awt.Component;
  3. import java.awt.EventQueue;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.Image;
  7. import java.util.Dictionary;
  8. import java.util.Hashtable;

  9. import javax.swing.ImageIcon;
  10. import javax.swing.JFrame;
  11. import javax.swing.JLabel;
  12. import javax.swing.JPanel;
  13. import javax.swing.JSlider;
  14. import javax.swing.UIManager;
  15. import javax.swing.border.EmptyBorder;
  16. import javax.swing.event.ChangeEvent;
  17. import javax.swing.event.ChangeListener;

  18. public class ShearImageDemo extends JFrame {
  19.    
  20.     /**
  21.      *
  22.      */
  23.     private static final long serialVersionUID = 3405356852103214547L;
  24.     private JPanel contentPane;
  25.     private JLabel label;
  26.    
  27.     /**
  28.      * Launch the application.
  29.      */
  30.     public static void main(String[] args) {
  31.         try {
  32.             UIManager
  33.                     .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
  34.         } catch (Throwable e) {
  35.             e.printStackTrace();
  36.         }
  37.         EventQueue.invokeLater(new Runnable() {
  38.             public void run() {
  39.                 try {
  40.                     ShearImageDemo frame = new ShearImageDemo();
  41.                     frame.setVisible(true);
  42.                 } catch (Exception e) {
  43.                     e.printStackTrace();
  44.                 }
  45.             }
  46.         });
  47.     }
  48.    
  49.     /**
  50.      * Create the frame.
  51.      */
  52.     public ShearImageDemo() {
  53.         setTitle("倾斜图像");// 设置窗体的标题
  54.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体退出时操作
  55.         setBounds(100, 100, 450, 300);// 设置窗体位置和大小
  56.         contentPane = new JPanel();// 创建内容面板
  57.         contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));// 设置面板的边框
  58.         contentPane.setLayout(new BorderLayout(0, 0));// 设置内容面板为边界布局
  59.         setContentPane(contentPane);// 应用内容面板
  60.         
  61.         JPanel panel = new JPanel();// 创建面板
  62.         contentPane.add(panel, BorderLayout.SOUTH);// 将新面板放置在内容面板南面
  63.         
  64.         final JSlider slider = new JSlider();
  65.         slider.setSnapToTicks(true);// 设置滑块自动靠近最近的刻度值
  66.         slider.setMajorTickSpacing(1);// 将主刻度间隔设置成1
  67.         slider.setPaintLabels(true);// 显示滑块标签
  68.         slider.setPaintTicks(true);// 显示滑块刻度值
  69.         slider.setMinimum(0);// 设置滑块的最小值为0
  70.         slider.setMaximum(10);// 设置滑块的最大值为10
  71.         Dictionary<Integer, Component> sliderLabel = new Hashtable<Integer, Component>();// 创建滑块标签集合
  72.         sliderLabel.put(0, new JLabel("0.0"));// 为0刻度增加标签0.0
  73.         sliderLabel.put(1, new JLabel("0.1"));// 为1刻度增加标签0.1
  74.         sliderLabel.put(2, new JLabel("0.2"));// 为2刻度增加标签0.2
  75.         sliderLabel.put(3, new JLabel("0.3"));// 为3刻度增加标签0.3
  76.         sliderLabel.put(4, new JLabel("0.4"));// 为4刻度增加标签0.4
  77.         sliderLabel.put(5, new JLabel("0.5"));// 为0刻度增加标签0.5
  78.         sliderLabel.put(6, new JLabel("0.6"));// 为1刻度增加标签0.6
  79.         sliderLabel.put(7, new JLabel("0.7"));// 为2刻度增加标签0.7
  80.         sliderLabel.put(8, new JLabel("0.8"));// 为3刻度增加标签0.8
  81.         sliderLabel.put(9, new JLabel("0.9"));// 为4刻度增加标签0.9
  82.         sliderLabel.put(10, new JLabel("1.0"));// 为4刻度增加标签0.9
  83.         slider.setLabelTable(sliderLabel);// 应用滑块标签
  84.         slider.addChangeListener(new ChangeListener() {// 为滑块增加事件监听器
  85.             public void stateChanged(ChangeEvent e) {
  86.                 do_slider_stateChanged(e);
  87.             }
  88.         });
  89.         panel.setLayout(new BorderLayout(0, 0));// 设置新面板的布局为边界布局
  90.         panel.add(slider);// 在新面板上增加滑块
  91.         
  92.         label = new JLabel("") {
  93.             
  94.             /**
  95.              *
  96.              */
  97.             private static final long serialVersionUID = 8885169965910681721L;
  98.             
  99.             @Override
  100.             public void paint(Graphics g) {
  101.                 ImageIcon icon = new ImageIcon("src/images/image.jpg");// 获得图标
  102.                 Image image = icon.getImage();// 获得图像
  103.                 Graphics2D g2 = (Graphics2D) g;// 获得Graphics2D对象
  104.                 int value = slider.getValue();// 获得滑块值
  105.                 g2.shear((double) value / 10, 0);// 将图片向水平方向倾斜
  106.                 g2.drawImage(image, 0, 0, null);// 绘制图像
  107.                
  108.             }
  109.         };
  110.         contentPane.add(label, BorderLayout.CENTER);// 在内容面板中央增加标签
  111.     }
  112.    
  113.     protected void do_slider_stateChanged(ChangeEvent e) {
  114.         label.repaint(); // 滑动滑块时重新绘制标签
  115.         
  116.     }
  117.    
  118. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马