java SWT按钮下拉控件

hk8txs48  于 2022-12-10  发布在  Java
关注(0)|答案(3)|浏览(161)

是否有标准SWT控件类似于按钮显示箭头并且在按下时a * 打开下拉菜单,并且不是仅限工具栏的控件
应该是这样的:

它类似于组合框控件,只是“button”区域的行为更类似于实际的按钮--它的文本不会根据您的选择而改变,单击时它会显示为凹陷,并且项目将用于操作或导航目的,而不是用于选择。它也类似于工具栏可用的控件,但我需要在常规组合上使用它。
通过使用常规的按钮和弹出菜单控件,这几乎是可行的--然而,我不相信我可以用这种方式在按钮上的文本旁边显示箭头。无论如何,由于这种控件看起来相当常见,我假设会有一种标准的方法来将这两个东西作为一个来使用。

mf98qq94

mf98qq941#

我想,这就是您应该做的下拉菜单行为
1.使用样式SWT.DROP_DOWN创建Menu
1.在Menu上创建MenuItems
如果你想要一个按钮
1.创建样式为SWT.ARROW | SWT.DOWN的按钮
1.将SelectionListener相加
1.在SelectionListener中,使用样式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();
      }
tv6aics1

tv6aics12#

这个snippet展示了如何在SWT工具栏中使用所描述的小部件。你可以使用item.setText()方法设置按钮文本。

i86rm4rw

i86rm4rw3#

这个问题差不多有10年的历史了,但以防万一有人还在寻找解决方案(就像我刚才做的那样;)):
我使用ButtonMenu实现了与您描述的行为非常接近的行为,方法如下: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);
    }
});

结果是,当您(左)单击按钮时,将显示菜单。
额外的好处:为了在最后实现扩展图标,你可以在按钮文本中添加一个unicode字符作为下三角形,如下所示:

button.setText("Animals \u2BC6");

本·特赫

相关问题