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 }