SWT按钮下拉控制

时间:2013-04-19 20:52:57

标签: java button drop-down-menu swt controls

标准SWT控件是否类似按钮显示箭头打开下拉菜单当按下并且不是仅限工具栏的控件

这将是这样的:

enter image description here

它类似于组合框控件,除了“按钮”区域与实际按钮的行为更相似 - 它的文本不会根据您的选择而改变,点击时会显得很沮丧,而且项目将是用于行动或导航目的,而不是用于选择。它也类似于可用于工具栏的控件,但我需要在常规复合材料上使用它。

这几乎可以通过使用常规按钮和弹出菜单控件来实现 - 但是,我不相信我可以通过这种方式在按钮上的文本旁边显示箭头。无论如何,由于这种控制看起来相当普遍,我认为有一种标准的方法可以将这两种东西用作一种。

2 个答案:

答案 0 :(得分:9)

我认为,这就是你应该做的下拉菜单行为

  1. 使用样式Menu
  2. 创建SWT.DROP_DOWN
  3. MenuItems
  4. 上创建Menu

    如果你想要一个按钮

    1. 创建一个样式为SWT.ARROW | SWT.DOWN
    2. 的按钮
    3. 添加SelectionListener
    4. SelectionListener中,创建一个样式为SWT.POP_UP的菜单,并将菜单放在按钮位置。
    5. //代码

      public static void main(String[] args) {
              Display display = new Display();
              final Shell shell = new Shell(display);
              shell.setSize(300, 200);
              shell.setText("Button Example");
              shell.setLayout(new RowLayout());
      
      
              /**
               * 
               * Approach1
               * 
               */
              final Composite btnCntrl = new Composite(shell, SWT.BORDER);
              btnCntrl.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
              btnCntrl.setBackgroundMode(SWT.INHERIT_FORCE);
              GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).spacing(0, 1).applyTo(btnCntrl);
              CLabel lbl = new CLabel(btnCntrl, SWT.NONE);
              lbl.setText("Animals");
              Button btn = new Button(btnCntrl, SWT.FLAT|SWT.ARROW|SWT.DOWN);
              btn.setLayoutData(new GridData(GridData.FILL_VERTICAL));
      
              btn.addSelectionListener(new SelectionAdapter() {
                  @Override
                  public void widgetSelected(SelectionEvent e) {
                      super.widgetSelected(e);
                      Menu menu = new Menu(shell, SWT.POP_UP);
      
                      MenuItem item1 = new MenuItem(menu, SWT.PUSH);
                      item1.setText("Hare");
                      MenuItem item2 = new MenuItem(menu, SWT.PUSH);
                      item2.setText("Fox");
                      MenuItem item3 = new MenuItem(menu, SWT.PUSH);
                      item3.setText("Pony");
      
      
      
                      Point loc = btnCntrl.getLocation();
                      Rectangle rect = btnCntrl.getBounds();
      
                      Point mLoc = new Point(loc.x-1, loc.y+rect.height);
      
                      menu.setLocation(shell.getDisplay().map(btnCntrl.getParent(), null, mLoc));
      
                      menu.setVisible(true);
                  }
              });
      
      
      
              /***
               * 
               * 
               * Approach 2
               * 
               */
      
      
              final Composite btnCntrl2 = new Composite(shell, SWT.BORDER);
              btnCntrl2.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
              btnCntrl2.setBackgroundMode(SWT.INHERIT_FORCE);
              GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).spacing(0, 1).applyTo(btnCntrl2);
              CLabel lbl2 = new CLabel(btnCntrl2, SWT.NONE);
              lbl2.setText("Animals");
              Button btn2 = new Button(btnCntrl2, SWT.FLAT|SWT.ARROW|SWT.DOWN);
              btn2.setLayoutData(new GridData(GridData.FILL_VERTICAL));
      
              btn2.addSelectionListener(new SelectionAdapter() {
                  @Override
                  public void widgetSelected(SelectionEvent e) {
                      super.widgetSelected(e);
                      Shell menu = (Shell) btnCntrl2.getData("subshell");
                      if(menu != null && !menu.isDisposed()){
                          menu.dispose();
                      }
                      menu = new Shell(shell, SWT.NONE);
                      menu.setLayout(new FillLayout());
                      Table table = new Table(menu, SWT.FULL_SELECTION);
                      table.addListener(SWT.MeasureItem, new Listener() {
      
                          @Override
                          public void handleEvent(Event event) {
                              event.height = 20; //TODO: determine later
                          }
                      });
      
                      table.addListener(SWT.PaintItem, new Listener() {
      
                          @Override
                          public void handleEvent(Event event) {
                              Rectangle bounds = event.getBounds();
                              event.gc.setBackground(event.display.getSystemColor(SWT.COLOR_BLUE));
                              event.gc.drawLine(bounds.x, bounds.y+bounds.height-1, bounds.x+bounds.width, bounds.y+bounds.height-1);
                          }
                      });
                      TableItem tableItem= new TableItem(table, SWT.NONE);
                      tableItem.setText(0, "Hare");
      
                      TableItem tableItem2= new TableItem(table, SWT.NONE);
                      tableItem2.setText(0, "Pony" );
      
                      TableItem tableItem3= new TableItem(table, SWT.NONE);
                      tableItem3.setText(0, "Dog");
      
      
                      Point loc = btnCntrl2.getLocation();
                      Rectangle rect = btnCntrl2.getBounds();
      
                      Point mLoc = new Point(loc.x, loc.y+rect.height);
      
                      menu.setLocation(shell.getDisplay().map(btnCntrl2.getParent(), null, mLoc));
                      menu.pack();
                      menu.setVisible(true);
      
                      btnCntrl2.setData("subshell", menu);
      
                  }
              });
      
              display.addFilter(SWT.MouseDown, new Listener() {
      
                  @Override
                  public void handleEvent(Event event) {
                      Shell shell = (Shell) btnCntrl2.getData("subshell");
                      if(shell != null && !shell.getBounds().contains(event.display.map((Control)event.widget, null, new Point(event.x, event.y)))){
                          shell.dispose();
                          btnCntrl2.setData("subshell", null);
                      }
                  }
              });
      
              shell.open();
              while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                  display.sleep();
              }
              display.dispose();
            }
      

答案 1 :(得分:1)

这个snippet显示了如何在SWT工具栏中使用所描述的小部件。您可以使用item.setText()方法设置按钮文本。