swt模拟radiobutton

  1 public class RadioButton extends Canvas {
  2 
  3     protected final Image RADIO_CHECKED = createImage("radiobutton_checked.png");
  4     protected final Image RADIO_UNCHECKED = createImage("radiobutton_unchecked.png");
  5  
  6     protected Image decrotorImage;//左侧图标
  7     protected String text = "RadioButton";//默认文字
  8     protected boolean selection;//选中状态
  9     protected int imageSize = 16;//默认图标大小
 10     
 11     private int mouse = 0;//鼠标状态
 12     private boolean hit = false;//碰撞
 13      
 14     /**
 15      * 
 16      * @param parent
 17      * @param style SWT.NONE
 18      */
 19     public RadioButton(Composite parent, int style) {
 20 
 21         super(parent, style);
 22         //默认未选中
 23         setDecrotorImage(RADIO_UNCHECKED);
 24 
 25         this.addPaintListener(new PaintListener() {
 26 
 27             //绘制按钮
 28             @Override
 29             public void paintControl(PaintEvent e) {
 30 
 31                 Rectangle rect = getBounds();
 32                 Color foreground = getForeground();
 33                 Color background = getBackground();
 34                 Font font = getFont();
 35 
 36                 e.gc.setBackground(background);
 37                 e.gc.setForeground(foreground);
 38                 e.gc.setFont(font);
 39 
 40                 //图片垂直居中
 41                 int imgX = 2;
 42                 int imgY = (rect.height - imageSize) / 2;
 43                 e.gc.drawImage(getDecrotorImage(), imgX, imgY);
 44 
 45                 //文字垂直居中
 46                 FontMetrics fontMetrics = e.gc.getFontMetrics();
 47                 int padding = 2;
 48                 int txtX = imgX + getDecrotorImage().getBounds().width + padding;
 49                 int txtY = (rect.height - fontMetrics.getHeight()) / 2;
 50                 e.gc.drawText(getText(), txtX, txtY - 1);
 51 
 52                 e.gc.dispose();
 53 
 54             }
 55         });
 56         this.addMouseListener(new MouseAdapter() {
 57             @Override
 58             public void mouseDown(MouseEvent e) {
 59                 hit = true;
 60                 mouse = 2;
 61                 // redraw();
 62             }
 63 
 64             @Override
 65             public void mouseUp(MouseEvent e) {
 66                 hit = false;
 67                 mouse = 1;
 68                 if (e.x < 0 || e.y < 0 || e.x > getBounds().width || e.y > getBounds().height) {
 69                     mouse = 0;
 70                 }
 71                 if (mouse == 1) {
 72                     setSelection(true);
 73                     //触发重绘
 74                     redraw(); 
 75                     notifyListeners(SWT.Selection, new Event());
 76                 } 
 77             }
 78         });
 79         this.setCursor(new Cursor(this.getDisplay(), SWT.CURSOR_HAND));
 80         
 81     }
 82 
 83     private static Image createImage(String name) {
 84         InputStream stream = RadioButton.class.getResourceAsStream(name);
 85         Image image = new Image(null, stream);
 86         try {
 87             stream.close();
 88         } catch (IOException ioe) {
 89         }
 90         return image;
 91     }
 92 
 93     public void setSelection(boolean selection) {
 94         if (this.selection == selection) {
 95             return;
 96         }
 97         this.selection = selection;
 98         //设置互斥
 99         if (selection) {
100             if (getParent() != null) {
101                 Control[] controls = getParent().getChildren();
102                 for (Control control : controls) {
103                     if (control instanceof RadioButton) {
104                         if (!(this == control))
105                             ((RadioButton) control).setSelection(false);
106                     }
107                 }
108             }
109         }
110         setDecrotorImage(selection ? RADIO_CHECKED : RADIO_UNCHECKED);
111         redraw();
112     }
113 
114     /**
115      * @param decrotorImage the decrotorImage to set
116      */
117     protected void setDecrotorImage(Image decrotorImage) { 
118         //对图片进行缩放
119         ImageData imageData = decrotorImage.getImageData();
120         ImageData newImageData = imageData.scaledTo(imageSize, imageSize);
121         Image scaledImage = new Image(getDisplay(), newImageData);  
122         this.decrotorImage = scaledImage;
123     }
124 
125     /**
126      * @return the decrotorImage
127      */
128     protected Image getDecrotorImage() {
129         return decrotorImage;
130     }
131     
132     
133     /**
134      * @param text the text to set
135      */
136     public void setText(String text) {
137         this.text = text;
138     }
139 
140 
141     /**
142      * @return the text
143      */
144     public String getText() {
145         return text;
146     }
147 
148     /**
149      * @return the selection
150      */
151     public boolean isSelection() {
152         return selection;
153     }
154 
155     public int getImageSize() {
156         return imageSize;
157     }
158 
159     public void setImageSize(int imageSize) {
160         this.imageSize = imageSize;
161     }
162 
163 }

 

posted @ 2022-12-15 10:13  gzhq  阅读(28)  评论(0编辑  收藏  举报