是否可以进行垂直SWT控制?

时间:2010-10-01 08:33:53

标签: java swt eclipse-rcp

我希望在应用中有一些控件 - ButtonLabel s - 垂直方向 - 。但是我找不到这样做的可能性。即使是非公共的setOrientation方法也只处理从左到右的方向。 是否可以不实施自定义Button或从Canvas派生?

3 个答案:

答案 0 :(得分:3)

SWT使用主机操作系统提供的标准小部件。因此,如果操作系统不支持垂直方向控件,SWT也无法提供支持。

答案 1 :(得分:2)

据我所知,Button和Label的垂直方向是不可能的。 您需要提供相同的自定义实现。 请检查此链接http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg30094.html

答案 2 :(得分:2)

是的,SWT可以使用自定义小部件。 您需要制作自己的Button / Label。 在PaintListener中,获取Transform对象并将文本旋转到所需的角度。 在每次单击的示例中,将角度更改为此序列0,90,180,270。 通过设置button可以更改Canvas(此处为bounds)宽高比。 随意使用paint方法;

public class RotatingButton extends Canvas
{
    private int     mouse           = 0;
    private boolean hit             = false;
    private String  text            = "Button";
    float           rotatingAngle   = 0f;
    float[]         angles          = { 0, 90, 180, 270 };
    int             index           = 0;
public RotatingButton(Composite parent, int style)
{
    super(parent, style);

    this.addListener(SWT.MouseUp, new Listener()
    {

        @Override
        public void handleEvent(Event e)
        {
            index++;
            index = index > 3 ? 0 : index;
                Rectangle r = getBounds();

                setBounds(r.x, r.y, r.height, r.width);


            rotatingAngle = angles[index];
            redraw();
        }
    });
    this.addPaintListener(new PaintListener()
    {
        public void paintControl(PaintEvent e)
        {
            paint(e);
        }
    });
    this.addMouseMoveListener(new MouseMoveListener()
    {
        public void mouseMove(MouseEvent e)
        {
            if (!hit)
                return;
            mouse = 2;
            if (e.x < 0 || e.y < 0 || e.x > getBounds().width
                    || e.y > getBounds().height)
            {
                mouse = 0;
            }
            redraw();
        }
    });
    this.addMouseTrackListener(new MouseTrackAdapter()
    {
        public void mouseEnter(MouseEvent e)
        {
            mouse = 1;
            redraw();
        }

        public void mouseExit(MouseEvent e)
        {
            mouse = 0;
            redraw();
        }
    });
    this.addMouseListener(new MouseAdapter()
    {
        public void mouseDown(MouseEvent e)
        {
            hit = true;
            mouse = 2;
            redraw();
        }

        public void mouseUp(MouseEvent e)
        {
            hit = false;
            mouse = 1;
            if (e.x < 0 || e.y < 0 || e.x > getBounds().width
                    || e.y > getBounds().height)
            {
                mouse = 0;
            }
            redraw();
            if (mouse == 1)
                notifyListeners(SWT.Selection, new Event());
        }
    });
    this.addKeyListener(new KeyAdapter()
    {
        public void keyPressed(KeyEvent e)
        {
            if (e.keyCode == '\r' || e.character == ' ')
            {
                Event event = new Event();
                notifyListeners(SWT.Selection, event);
            }
        }
    });
}

public void setText(String string)
{
    this.text = string;
    redraw();
}

public void paint(PaintEvent e)
{
    Transform tr = null;
    tr = new Transform(e.display);

    Rectangle r =getBounds();
    text=e.gc.stringExtent(text)+"";
    e.gc.setAntialias(SWT.ON);
    Point p=e.gc.stringExtent(text);
    int w = e.width;
    int h = e.height;
    tr.translate(w / 2, h / 2);
    tr.rotate(rotatingAngle);
    e.gc.setTransform(tr);
    e.gc.drawString(text, r.x-(p.x/3)*2,r.y-p.y);
}
}

Screen SHOT