utilizar utiliza usar propiedades hacer desplegable con como botones java button drop-down-menu swt controls

java - utiliza - Control desplegable del botón SWT



jcombobox java propiedades (2)

¿Hay un control SWT estándar que se asemeja a un botón que muestra una flecha y abre un menú desplegable cuando se presiona y no es un control de barra de herramientas ?

Sería algo como esto:

Es similar a un control de cuadro combinado, excepto que el área del "botón" actuaría de manera más similar a un botón real - su texto no cambiaría en función de su selección, aparecería deprimido al hacer clic y los elementos se usarían para acciones o fines de navegación en lugar de para la selección. También es similar a un control disponible para barras de herramientas, pero necesito usarlo en un compuesto regular en su lugar.

Esto es casi factible simplemente mediante el uso de botones regulares y controles de menú emergente; sin embargo, no creo que pueda mostrar la flecha al lado del texto en el botón de esta manera. De todos modos, dado que este tipo de control parece bastante común, supuse que habría una forma estándar de usar estas dos cosas como una sola.


Creo que esto es lo que debes hacer para obtener el comportamiento del menú desplegable

  1. Crear Menu con estilo SWT.DROP_DOWN
  2. Crear elementos de Menu en el Menu

si quieres un botón

  1. Crear un botón con estilo SWT.ARROW | SWT.DOWN SWT.ARROW | SWT.DOWN
  2. agregar SelectionListener
  3. En SelectionListener , SWT.POP_UP un menú con estilo SWT.POP_UP y coloque el menú en la ubicación del botón.

//código

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


Este fragmento muestra cómo usar el widget descrito en una barra de herramientas SWT. Puede establecer el texto del botón utilizando el método item.setText() .