Google一下,SWT GC也可以旋转绘制text,于是用SWT Canvas重写了DirectionLabel。
之前用Draw2d绘制的,我重名为DirectionLabelByDraw2d。
https://github.com/tadckle/rcp/blob/master/rcp3/rcp3.study/src/rcp3/study/composite/DirectionLabelByDraw2d.java
SWT本身的Label不能垂直显示,为了实现垂直显示,可以使用Draw2d手动绘制。我将其封装成一个DirectionLabel,方便重用。
和使用其它SWT控件一样,它接受三个参数:
- Composite: parent composite.
- String: label text.
- int: appearance style.
创建完后,可调用setRotation方法设置旋转度数,参数是一个enum,有四个值可选择:ANGLE_0, ANGLE_90, ANGLE_180, ANGLE_270。不调用此方法,就是不旋转。
DirectionLabel lbl = new DirectionLabel(shell,"This is label message", SWT.BORDER); lbl.setRotation(Rotation.ANGLE_90);
下面的example展示了四种旋转状态。
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import rcp3.study.composite.DirectionLabel.Rotation;
public class MainUsage {
public static void main(String[] args) {
Display display = Display.getDefault();
Shell shell = new Shell(display);
GridLayoutFactory.swtDefaults().numColumns(4).applyTo(shell);
String text = "This is label message";
DirectionLabel lbl1 = new DirectionLabel(shell,text, SWT.BORDER);
lbl1.setRotation(Rotation.ANGLE_0);
GridDataFactory.swtDefaults().applyTo(lbl1);
DirectionLabel lbl2 = new DirectionLabel(shell,text, SWT.BORDER);
lbl2.setRotation(Rotation.ANGLE_90);
GridDataFactory.swtDefaults().applyTo(lbl2);
DirectionLabel lbl3 = new DirectionLabel(shell,text, SWT.BORDER);
lbl3.setRotation(Rotation.ANGLE_180);
GridDataFactory.swtDefaults().applyTo(lbl3);
DirectionLabel lbl4 = new DirectionLabel(shell,text, SWT.BORDER);
lbl4.setRotation(Rotation.ANGLE_270);
GridDataFactory.swtDefaults().applyTo(lbl4);
lbl4.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_RED));
lbl4.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW));
lbl4.setFont(FontDescriptor.createFrom(lbl4.getFont())
.setHeight(9).createFont(Display.getDefault()));
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
shell.dispose();
display.dispose();
}
}