2013-04-19 8 views
6

Gibt es eine Standard SWT Steuer, die eine Taste die zeigt ein Pfeil Menü und öffnet ein Drop-Down ähnelt, wenn sie gedrückt und ist kein Toolbar-only Kontrolle?SWT-Knopf Dropdown Kontrolle

Es wäre so etwas wie dieses:

enter image description here

Es ist ähnlich wie ein Kombinationsfeld-Steuerelement, mit der Ausnahme, dass der „Knopf“ Bereich mehr in ähnlicher Weise zu einer tatsächlichen Schaltfläche handeln würde - der Text würde sich nicht ändern basierend auf Ihrer Auswahl würde es beim Klicken gedrückt angezeigt werden, und die Elemente würden für Aktionen oder Navigationszwecke statt für die Auswahl verwendet werden. Es ist auch vergleichbar mit einem Steuerelement für Symbolleisten, aber ich muss es stattdessen auf einem regulären Composite verwenden.

Dies ist fast möglich, indem Sie einfach reguläre Schaltfläche und Popup-Menü-Steuerelemente verwenden - aber ich glaube nicht, dass ich den Pfeil neben dem Text auf der Schaltfläche auf diese Weise anzeigen kann. Wie auch immer, da diese Art von Kontrolle ziemlich häufig vorkommt, nahm ich an, dass es einen Standardweg geben würde, diese beiden Dinge als einen zu verwenden.

Antwort

1

Diese snippet zeigt, wie Sie das beschriebene Widget in einer SWT-Symbolleiste verwenden. Sie können den Schaltflächentext mithilfe der Methode item.setText() festlegen.

8

denke ich, ist es das, was Sie Menü Verhalten

  1. Menu mit Stil SWT.DROP_DOWN
  2. MenuItems auf Menu

wenn Sie

eine Schaltfläche wollen einrichten Drop down tun bekommen sollte
  1. Erstellen Sie ein Aber Tonne mit Stil SWT.ARROW | SWT.DOWN
  2. hinzufügen SelectionListener
  3. In SelectionListener, Erstellen Sie ein Menü mit Stil SWT.POP_UP und das Menü auf die Schaltfläche Standort positionieren.

// Code

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

Leider versuche ich aktiv mit Menü- oder Toolbar-basierten Kontrollen zu vermeiden. Ich versuche etwas zu verwenden, das normalerweise auf einem Composite funktioniert. –

+0

aktualisiert meine Antwort –

+0

Ich habe "ARROW | DOWN" zuvor versucht, und es scheint sehr zu fehlen. Es ist weder mit Text noch Bildern kompatibel, von dem was ich sehe. –