2013-04-19 19 views
6

矢印とが押されたときにドロップダウンメニューを開き、ツールバーのみの制御ないディスプレイボタンに似ている標準のSWTコントロールはありますか?SWTボタンドロップダウンコントロール

それはこのようなものになるだろう:それは、「ボタン」の領域は、実際のボタンにより同様に作用するであろうこと以外は、コンボボックスコントロールに似て

enter image description here

- そのテキストが変更されないでしょうあなたの選択に基づいて、それはクリックされると押されたように見え、アイテムは選択の代わりにアクションまたはナビゲーション目的のために使用されます。また、ツールバーで使用できるコントロールと似ていますが、代わりに通常のコンポジットで使用する必要があります。

これは、通常のボタンとポップアップメニューのコントロールを使うだけで簡単に行えますが、私はこの方法でボタンのテキストの隣に矢印を表示することはできません。とにかく、この種の制御はかなり共通しているように見えるので、私はこれら2つのものを1つにする標準的な方法があると仮定しました。

答えて

1

このsnippetは、記述されたウィジェットをSWTツールバーで使用する方法を示しています。 item.setText()メソッドを使用してボタンのテキストを設定できます。

8

私は、これはあなたがボタン

をしたい場合は Menu

MenuItemsを作成し、スタイルSWT.DROP_DOWN

  • Menuを作成]メニューの挙動

    1. をドロップダウンを取得何をすべきかだと思います
      1. 作成するスタイルSWT.ARROW | SWT.DOWN
      2. とトンは、SelectionListenerSelectionListener
      3. を追加するスタイル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(); 
           } 
      
  • +0

    残念ながら、私は積極的にメニュー - またはツールバーベースのコントロールを使用しないようにしようとしています。私はコンポジット上で正常に動作するものを使用しようとしています。 –

    +0

    更新された私の答え –

    +0

    私は以前に "ARROW | DOWN"を試しましたが、それは非常に欠けているようです。私は見ることができないテキストや画像とも互換性がありません。 –