SWT树节点上弹出菜单的实现

标题:SWT树节点上弹出菜单的实现
作者:kagula(lee353086)
日期:20080204

简介:
    通过示代码片段,介绍如何在SWT的Tree对象TreeItem节点上,实现弹出菜单。

关键词:
    SWT、Tree、TreeItem、Menu、MenuItem

正文:
    [1]为Tree控件建立Listen,例如下代码:
    tree1 = new Tree(dialogShell, SWT.NONE);
                                ...
    tree1.addMouseListener(new MouseAdapter() {
     public void mouseDoubleClick(MouseEvent evt) {
      tree1MouseDoubleClick(evt);
     }
     public void mouseDown(MouseEvent evt) {
      tree1MouseDown(evt);
     }
    });

     [2]为Tree控件,增加节点!
        使用TreeItem类对象,略。

     [3]为用户建弹出菜单;  在tree1MouseDown代码段内,添加下面代码。
 TreeItem selected=tree1.getItem(new Point(evt.x,evt.y));  //取节点控件
 if(selected!=null&&evt.button==3)   //如果取到节点控件,且是鼠标右键
 {
   Menu menu=new Menu(dialogShell,SWT.POP_UP);  //为节点建POP UP菜单
   if(selected.getParentItem()!=null)  //如果不是根节点
   {
  MenuItem mi4=new MenuItem(menu,SWT.PUSH);  //为菜单,建菜单项
  mi4.setText("向["+selected.getText()+"]节点,发送即时消息!");
  mi4.setData(selected.getText());  //向响应菜单项事件的代码,传递值。
  mi4.addListener(SWT.Selection, new Listener() {
  public void handleEvent(Event e) {  //向指定用户发送消息!
   MenuItem mi=(MenuItem)e.widget;  //取菜单项Widget
   String selected=(String)mi.getData();  //取,在建立菜单项时,传过来的对象。
   if(selected!=null)
   { //添加,响应代码 }
  }
  });
            } else { 如果,是根节点,即selected.getParentItem()==null为真。 }
            tree1.setMenu(menu);  //设置弹出菜单
 }else if(evt.button==3)  //选中的是树形控件的空白区
 {
           //响应代码段,略
 }

参考网站:
[1]SWT官网
http://www.eclipse.org/swt/
[2]Jigloo官网
http://www.cloudgarden.com/jigloo/ 

以下是使用 Eclipse SWT 实现在两个之间绘制连线的示例代码: ```java import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; public class TreeLinkExample { private static TreeItem sourceItem = null; private static TreeItem targetItem = null; public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Tree tree1 = new Tree(shell, SWT.BORDER); for (int i = 0; i < 5; i++) { TreeItem item = new TreeItem(tree1, SWT.NONE); item.setText("Item " + i); } Tree tree2 = new Tree(shell, SWT.BORDER); for (int i = 0; i < 5; i++) { TreeItem item = new TreeItem(tree2, SWT.NONE); item.setText("Item " + i); } Canvas canvas = new Canvas(shell, SWT.NONE); canvas.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent e) { if (sourceItem != null && targetItem != null) { GC gc = e.gc; Rectangle sourceBounds = sourceItem.getBounds(); Rectangle targetBounds = targetItem.getBounds(); Point sourceCenter = new Point(sourceBounds.x + sourceBounds.width / 2, sourceBounds.y + sourceBounds.height / 2); Point targetCenter = new Point(targetBounds.x + targetBounds.width / 2, targetBounds.y + targetBounds.height / 2); gc.setLineWidth(2); gc.setForeground(new Color(e.display, 0, 0, 255)); gc.drawLine(sourceCenter.x, sourceCenter.y, targetCenter.x, targetCenter.y); } } }); tree1.addListener(SWT.Selection, event -> { sourceItem = (TreeItem) event.item; redrawCanvas(canvas); }); tree2.addListener(SWT.Selection, event -> { targetItem = (TreeItem) event.item; redrawCanvas(canvas); }); shell.setSize(400, 300); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private static void redrawCanvas(Canvas canvas) { canvas.redraw(); canvas.update(); } } ``` 这个示例程序创建了两个控件和一个 `Canvas` 控件,并在控件上添加了 `Selection` 监听器,在监听器中记录了选中的项。同时,在 `Canvas` 上添加了 `PaintListener`,在监听器中根据选中的两个项绘制了一条连接线。当有项被选中时,先记录下来,然后调用 `redrawCanvas` 方法重绘 `Canvas` 控件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值