SWT 按钮下拉控件
Posted
技术标签:
【中文标题】SWT 按钮下拉控件【英文标题】:SWT Button Dropdown Control 【发布时间】:2013-04-13 08:38:24 【问题描述】:是否有一个类似于按钮的标准 SWT 控件,它显示一个箭头并打开一个下拉菜单按下时是否不是仅工具栏控件?
应该是这样的:
它类似于组合框控件,除了“按钮”区域的行为与实际按钮更相似 - 它的文本不会根据您的选择而改变,单击时会显示为按下,并且项目将是用于操作或导航目的,而不是用于选择。它也类似于可用于工具栏的控件,但我需要在常规组合上使用它。
这几乎可以通过使用常规按钮和弹出菜单控件来实现 - 但是,我不相信我可以以这种方式在按钮上的文本旁边显示箭头。无论如何,由于这种控制似乎相当普遍,我认为有一种标准方法可以将这两种东西合二为一。
【问题讨论】:
【参考方案1】:snippet 展示了如何在 SWT 工具栏中使用所描述的小部件。您可以使用item.setText()
方法设置按钮文本。
【讨论】:
【参考方案2】:我认为,这就是你应该做的下拉菜单行为
-
使用样式
SWT.DROP_DOWN
创建Menu
在Menu
上创建MenuItems
如果你想要一个按钮
-
创建一个样式为
SWT.ARROW | SWT.DOWN
的按钮
添加SelectionListener
在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();
【讨论】:
不幸的是,我正在积极尝试避免使用基于菜单或工具栏的控件。我正在尝试使用在复合材料上正常工作的东西。 我之前试过“ARROW | DOWN”,好像很欠缺。据我所知,它与文本和图像都不兼容。 如何使用标签和按钮(箭头,setimage)创建自己的合成!这不起作用? 我不知道。除非我以与您预期不同的方式进行操作,否则这样的构造看起来一点也不像自然控制。如果您认为可以做到,请附上屏幕截图作为详细答案。以上是关于SWT 按钮下拉控件的主要内容,如果未能解决你的问题,请参考以下文章