SWT按钮下拉控制

是否有一个标准的SWT控件类似于一个按钮 ,它显示一个箭头并在按下时打开一个下拉菜单 ,而不是一个仅限工具栏的控件

它会是这样的:

在此处输入图像描述

它类似于combobox控件,除了“按钮”区域与实际按钮的行为更相似 – 它的文本不会根据您的选择而改变,单击时会显示为按下,并且项目将用于操作或导航目的而不是选择。 它也类似于可用于工具栏的控件,但我需要在常规复合材料上使用它。

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

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

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

如果你想要一个按钮

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

//码

 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(); } 

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