简体   繁体   English

SWT 按钮下拉控件

[英]SWT Button Dropdown Control

Is there a standard SWT control that resembles a button which displays an arrow and opens a dropdown menu when pressed and is not a toolbar-only control ?是否有一个标准的 SWT 控件类似于一个按钮,它显示一个箭头并在按下时打开一个下拉菜单,而不是一个仅用于工具栏的控件

It would be something like this:它会是这样的:

在此处输入图像描述

It is similar to a combo box control, except that the "button" area would act more similarly to an actual button - its text would not change based on your selection, it would appear depressed when clicked, and the items would be used for actions or navigational purposes instead of for selection.它类似于组合框控件,只是“按钮”区域的行为更类似于实际按钮 - 它的文本不会根据您的选择而改变,单击时会显示为凹陷状态,并且项目将用于操作或导航目的,而不是用于选择。 It's also similar to a control available for toolbars, but I need to use it on a regular composite instead.它也类似于可用于工具栏的控件,但我需要在常规组合上使用它。

This is nearly doable simply by using regular button and popup-menu controls - however, I do not believe I can display the arrow next to the text on the button this way.这几乎可以通过使用常规按钮和弹出菜单控件来实现——但是,我不相信我可以通过这种方式在按钮上的文本旁边显示箭头。 Anyway, since this kind of control seems fairly common, I assumed there would be a standard way to use these two things as one.不管怎样,由于这种控制看起来相当普遍,我假设会有一种标准方法将这两个东西合二为一。

I think, this is what you should do get Drop down menu behavior 我想,这就是你应该做的下拉菜单行为

  1. Create Menu with style SWT.DROP_DOWN 使用样式SWT.DROP_DOWN创建Menu
  2. Create MenuItems on Menu Menu上创建MenuItems

if you want a button 如果你想要一个按钮

  1. Create a Button with style SWT.ARROW | SWT.DOWN 创建一个样式为SWT.ARROW | SWT.DOWN的按钮 SWT.ARROW | SWT.DOWN
  2. add SelectionListener 添加SelectionListener
  3. In SelectionListener , Create a Menu with style SWT.POP_UP and position the menu at the button location. SelectionListener ,使用样式SWT.POP_UP创建菜单,并将菜单放在按钮位置。

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

This snippet shows how to use the described widget in a SWT toolbar. 片段显示如何在SWT工具栏中使用所描述的窗口小部件。 You can set the button text by using the item.setText() method. 您可以使用item.setText()方法设置按钮文本。

This question is almost 10 years old, but just in case someone is still looking for a solution (like I just did;) ):这个问题已经有将近 10 年的历史了,但以防万一有人仍在寻找解决方案(就像我刚刚做的那样;)):

I achieved a pretty close behaviour of your description using only a Button and a Menu using this approach: http://eclipseo.blogspot.com/2012/07/show-context-menu-programmatically.html我使用这种方法仅使用一个Button和一个Menu实现了您的描述的非常接近的行为: http:http://eclipseo.blogspot.com/2012/07/show-context-menu-programmatically.html

Button button = new Button(parent, SWT.PUSH);
button.setText("Animals");

Menu menu = new Menu(button);
MenuItem item = new MenuItem(menu, SWT.PUSH);
item.setText("hare");

menu.addListener(SWT.Show, new Listener() {
    @Override
    public void handleEvent(Event event) {
        menu.setVisible(true);
    }
});

button.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {
        menu.notifyListeners(SWT.Show, null);
    }
});

The result is that the menu is shown when you (left) click on the button.结果是当您(左)单击按钮时显示菜单。

Bonus: to achieve the expand icon at the end, you can add a unicode character for a down triangle in the button text like so:奖励:为了在最后实现展开图标,您可以在按钮文本中为向下三角形添加一个 unicode 字符,如下所示:

button.setText("Animals \u2BC6");

HTH, Ben HTH,本

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM