2013-04-19 34 views
6

Có một điều khiển chuẩn SWT tương tự như một nút hiển thị một mũi tênmở ra một menu thả xuống khi ép và là không phải là một thanh công cụ chỉ kiểm soát?SWT nút Dropdown kiểm soát

Nó sẽ là một cái gì đó như thế này:

enter image description here

Nó tương tự như một điều khiển combo box, ngoại trừ các "nút" khu vực sẽ đóng vai trò tương tự hơn để một nút thực tế - văn bản của nó sẽ không thay đổi dựa trên lựa chọn của bạn, nó sẽ xuất hiện chán nản khi được nhấp và các mục sẽ được sử dụng cho các hành động hoặc mục đích điều hướng thay vì để lựa chọn. Nó cũng tương tự như một điều khiển có sẵn cho thanh công cụ, nhưng tôi cần phải sử dụng nó trên một hỗn hợp thông thường để thay thế.

Điều này gần như hoàn toàn có thể thực hiện được bằng cách sử dụng các nút điều khiển menu và trình đơn bật lên thông thường - tuy nhiên, tôi không tin rằng tôi có thể hiển thị mũi tên bên cạnh văn bản trên nút này theo cách này. Dù sao, vì kiểu kiểm soát này có vẻ khá phổ biến, tôi cho rằng sẽ có một cách tiêu chuẩn để sử dụng hai thứ này là một.

Trả lời

1

snippet này cho biết cách sử dụng tiện ích được mô tả trong thanh công cụ SWT. Bạn có thể đặt văn bản nút bằng cách sử dụng phương thức item.setText().

8

Tôi nghĩ rằng, đây là những gì bạn nên làm được thả xuống hành vi đơn

  1. Tạo Menu với phong cách SWT.DROP_DOWN
  2. Tạo MenuItems trên Menu

nếu bạn muốn có một nút

  1. Tạo một tấn với phong cách SWT.ARROW | SWT.DOWN
  2. thêm SelectionListener
  3. Trong SelectionListener, Tạo một Menu với phong cách SWT.POP_UP và vị trí menu ở vị trí nút.

// đang

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

Thật không may, tôi đang tích cực cố gắng tránh sử dụng các điều khiển menu- hoặc thanh công cụ dựa trên. Tôi đang cố gắng sử dụng một cái gì đó hoạt động bình thường trên một hỗn hợp. –

+0

cập nhật câu trả lời của tôi –

+0

Tôi đã thử "ARROW | DOWN" trước đây, và có vẻ như rất thiếu. Nó không tương thích với cả văn bản lẫn hình ảnh, từ những gì tôi có thể thấy. –