-
SWT 组合框20
各位大虾
我想用SWT做一个类似百度和谷歌那样的自动提示组合框,但是冥思苦想了好几周,都束手无策,我用Text和Menu组合,Text和List组合,但效果都不理想,每当我用弹出Menu和List后,Text都失去了焦点,没有办法再书写下去,请大虾们帮帮我,如何才能帮它给做出来,我在这里先谢谢了。下面是我用Text和Menu的组合,请大虾们指点一下,谢谢。
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class MyCombo extends Composite {
private Text text;
private Menu popupMenu = null;
public MyCombo(Composite parent1, int style) {
super(parent1, style);
init();
}
public void init() {
setLayout(new GridLayout(1, false));
text = new Text(this, SWT.BORDER);
initMenu();
text.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
e.doit = false;
int keyCode = e.keyCode;
if (keyCode == 13) {
popupMenu.setVisible(false);
}else {
Text text = (Text)e.getSource();
Point p = text.getParent().toDisplay(text.getLocation());
Point size = text.getSize();
Rectangle shellRect = new Rectangle(p.x, p.y + size.y, size.x, 0);
popupMenu.setLocation(shellRect.x,shellRect.y);
popupMenu.setVisible(true);
}
System.out.println(keyCode);
}
});
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
text.addTraverseListener(new TraverseListener(){
public void keyTraversed(TraverseEvent e) {
e.doit = false;
e.detail = SWT.TRAVERSE_NONE;
}
});
}
private void initMenu(){
popupMenu = new Menu(text);
MenuItem newItem = new MenuItem(popupMenu, SWT.CASCADE);
newItem.setText("New");
MenuItem refreshtem = new MenuItem(popupMenu, SWT.NONE);
refreshtem.setText("Refresh");
MenuItem deleteItem = new MenuItem(popupMenu, SWT.NONE);
deleteItem.setText("Delete");
Menu newMenu = new Menu(popupMenu);
newItem.setMenu(newMenu);
MenuItem shortcutItem = new MenuItem(newMenu, SWT.NONE);
shortcutItem.setText("Shortcut");
MenuItem iconItem = new MenuItem(newMenu, SWT.NONE);
iconItem.setText("Icon");
text.setMenu(popupMenu);
}
public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell();
FillLayout layout = new FillLayout();
layout.marginHeight = 20;
layout.marginWidth = 20;
shell.setLayout(layout);
shell.setSize(201, 183);
shell.setText("组合框演示");
//
shell.open();
final MyCombo combo = new MyCombo(shell, SWT.DROP_DOWN);
combo.setBounds(10, 10, 173, 21);
Menu menu = combo.getMenu();
String[] items = new String[4];
for (int i = 0; i < items.length; i++) {
items[i] = "选项" + i;
}
// combo.setItems(items);
/* combo.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if (e.keyCode==SWT.ARROW_LEFT) {
combo.select(combo.getSelectionIndex()-1);
}
if(e.keyCode==SWT.ARROW_RIGHT){
combo.select(combo.getSelectionIndex()+1);
}
}
}); */
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
问题补充:不好意思,你写的不是我想要的,我需要的是通过在Text里面输入,然后弹出List,并且不让Text失去焦点。不过还是谢谢你
问题补充:不好意思,你写的不是我想要的,我需要的是通过在Text里面输入,然后弹出List,并且不让Text失去焦点。不过还是谢谢你
问题补充:songfantasy 写道SWT没有用过。sorry
其实只要能用程序使得Combo的下拉菜单能弹出来也可以。
2010年9月29日 21:47
2个答案 按时间排序 按投票排序
-
用list 写了一个。看与你意思一样否。
public class Combo_baidu { private static Text text; private static List list; public static void main(String[] args) { final Display display = Display.getDefault(); final Shell shell = new Shell(); shell.setSize(400, 300); text = new Text(shell, SWT.BORDER); text.setBounds(10, 10, 200, 20); text.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { if(e.keyCode == SWT.ARROW_UP || e.keyCode == SWT.ARROW_DOWN) { int s = list.getSelectionIndex(); if(e.keyCode == SWT.ARROW_UP) { s--; } else { s++; } if(s>=0 && s<list.getItemCount()) { list.setSelection(s); text.setText(list.getSelection()[0]); text.setSelection(text.getCharCount()); } } } }); list = new List(shell, SWT.BORDER | SWT.SINGLE); for(int i=0; i<10; i++) { list.add("The item "+i+" ."); } list.setBounds(10, 30, 200, 200); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } }
效果图:
2010年9月30日 14:07
相关推荐
SWT(Standard Widget Toolkit)是Java编程中用于创建图形用户界面(GUI)的一种库,它为开发者提供了丰富的控件和对话框。在SWT中,`MessageBox`是一个用于显示简单的消息对话框的类,通常用来向用户显示警告、确认...
4. **可扩展性**: SWT允许开发者创建自定义控件,通过组合现有Widget实现新的功能。 5. **兼容性**: SWT支持多种操作系统,如Windows、Linux、macOS等,为跨平台开发提供了便利。 **使用SWT进行开发** 1. **初始...
例如,使用`new Button(parent, SWT.PUSH)`创建一个按钮,`new Text(parent, SWT.SINGLE)`创建一个单行文本框,`new Combo(parent, SWT.READ_ONLY)`创建一个只读的组合框。 3. **事件处理**: SWT通过监听器模型处理...
- **CCombo组件**:一种增强型的组合框组件。 - **TableEditor组件**:用于编辑表格中的单元格。 #### 5. SWT的组件布局 SWT提供了多种布局管理器,如: - **FillLayout**:填充式布局,使组件填满其容器。 - **...
##### 4.5 组合框(Combo) - **Combo** 组件是一个下拉列表。 - 创建组合框: ```java Combo combo1 = new Combo(shell, SWT.DROP_DOWN | SWT.READ_ONLY); combo1.setSize(150, 25); combo1.setLocation(30, ...
SWT中的`Shell`样式可以通过组合不同的样式常量来实现。下面是一些常用的样式及其功能介绍: - **SWT.BORDER**:为`Shell`添加一个边框。这通常是默认行为。 - **SWT.CLOSE**:在`Shell`的右上角显示一个关闭按钮。...
1. **基础控件**:SWT提供了一系列的基础控件,如按钮(Button)、文本框(Text)、列表(List)、组合框(Combo)、树(Tree)、表格(Table)等。每个控件都有相应的事件监听和方法,例如按钮的点击事件、文本框的文本更改事件...
- **CCombo组件**:组合框,结合了文本输入和下拉列表的功能。 - **TableEditor组件**:允许在表格中编辑单元格。 #### 5. SWT的组件布局 SWT提供了四种主要的布局方式: - **充满式布局**:组件自动扩展以填满...
6. **特性系统**:"features"目录下的内容则是Eclipse的特性(Feature)集合,特性是Eclipse插件的逻辑组合,用于打包和部署。这些特性定义了Eclipse安装或更新时应该包含哪些插件和服务。 7. **国际化与本地化**:...
Swt API提供了多种控件,如按钮(Button)、文本框(Text)、列表(List)、组合框(Combo)、滚动条(ScrollBar)等,这些控件与各个操作系统平台的原生控件保持一致,提供更好的用户体验。例如,`Button`类用于...
SWT库提供了丰富的组件,包括但不限于:按钮(Button)、文本域(Text)、组合框(ComboBox)、树视图(Tree)、列表视图(List)、进度条(ProgressBar)等。这些组件允许开发者构建各种复杂的用户界面,满足不同...
1. **基础组件**:SWT的基础组件包括按钮(Button)、文本框(Text)、单选按钮(RadioButton)、复选框(Checkbox)、列表(List)、组合框(ComboBox)等。这些组件在GUI设计中十分常见,是构建用户交互的基本元素...
4. **Composite**: 用于组合其他Widget的容器,如`Composite container = new Composite(shell, SWT.NONE);` 5. **Table**: 创建表格控件,如`Table table = new Table(shell, SWT.MULTI | SWT.H_SCROLL | SWT.V_...
在实际开发中,可以根据需求组合使用不同的布局和布局数据。例如,可以创建嵌套的Composites,每个Composite使用不同的布局,以实现复杂的界面结构。同时,布局数据可以设置对齐方式、权重、最小和最大大小等属性,...
- **组合框(Combo)**:结合了文本框和下拉列表,用户可以直接输入或从下拉列表中选择。 - **进度条(ProgressBar)**:显示任务的完成进度。 2. **容器控件** - **壳体(Shell)**:作为应用程序窗口的基础,可以...
- **SWT.RADIO**:单选按钮,通常与其他单选按钮组合使用,以便用户只能选择其中一个。 - **SWT.ARROW**:箭头按钮,常用于导航或控制方向。 - **SWT.NONE**:默认按钮样式。 - **SWT.CENTER/SWT.LEFT/SWT.RIGHT**:...
- **Composite**: Composite是SWT中的一个关键组件,它允许你组合多个Widget来创建更复杂的布局结构。 - **Layout**: Layout管理器负责控制Composite中的子Widget如何在界面上排列和布局,例如填充、网格、单列等...
这些库文件组合在一起,为开发者提供了构建强大、可扩展且跨平台的Java GUI应用程序的工具集。通过SWT,开发者可以利用原生系统资源创建高性能的用户界面,而JFace则进一步抽象了SWT,提供了一套更加面向对象的API,...
- Composite:组合组件,可以包含其他组件,用于构建复杂的布局。 - Shell:顶级窗口,通常作为应用程序的主窗口。 - Menu:菜单,包括下拉菜单和弹出式菜单,用于放置菜单项。 - Tree/ListView:树形视图和列表...
开发者可以根据需求组合这些组件,构建出复杂的应用界面。 **2. 表格与树视图** 在SWT中,`Table`和`Tree`控件提供了数据展示的强大功能。`Table`控件可以用于展示表格数据,支持多列和多种排序方式;`Tree`控件则...