2013-04-19 22 views
6

Esiste un controllo standard di SWT che assomiglia a un tasto che visualizza una freccia e si apre un menu a discesa quando viene premuto ed è non è un controllo barra degli strumenti di sola?SWT pulsante a discesa Controllo

Sarebbe qualcosa di simile:

enter image description here

E 'simile a un controllo casella combinata, tranne che l'area "pulsante" sarebbe agire in modo più simile a un tasto vero e proprio - il suo testo non sarebbe il cambiamento in base alla selezione, apparirebbe premuto quando si fa clic e gli elementi sarebbero utilizzati per le azioni o per scopi di navigazione anziché per la selezione. È anche simile a un controllo disponibile per le barre degli strumenti, ma ho invece bisogno di usarlo su un composito normale.

Questo è quasi fattibile semplicemente usando i normali pulsanti e controlli del menu a comparsa - tuttavia, non credo di poter visualizzare la freccia accanto al testo sul pulsante in questo modo. Comunque, dal momento che questo tipo di controllo sembra abbastanza comune, ho pensato che ci sarebbe stato un modo standard per usare queste due cose come una cosa sola.

risposta

1

Questo snippet mostra come utilizzare il widget descritto in una barra degli strumenti SWT. È possibile impostare il testo del pulsante utilizzando il metodo item.setText().

8

penso, questo è ciò che si dovrebbe fare ottenere Scendete comportamento menù

  1. Crea Menu con stile SWT.DROP_DOWN
  2. Crea MenuItems su Menu

se si desidera un pulsante

  1. Creare un ma ton con stile SWT.ARROW | SWT.DOWN
  2. aggiungere SelectionListener
  3. In SelectionListener, creare un menu con stile SWT.POP_UP e posizionare il menu nella posizione del pulsante.

// codice

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

Purtroppo, sono attivamente cercando di evitare l'uso di controlli Menu- o della barra degli strumenti-based. Sto cercando di usare qualcosa che funzioni normalmente su un composito. –

+0

aggiornato la mia risposta –

+0

Ho già provato "ARROW | DOWN" e sembra che manchi molto. Non è compatibile né con testo né immagini, da quello che posso vedere. –

Problemi correlati