0 0

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个答案 按时间排序 按投票排序

0 0

用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
0 0

SWT没有用过。sorry

2010年9月30日 07:39

相关推荐

    SWT 弹出对话框 可以选择的图标种类

    SWT(Standard Widget Toolkit)是Java编程中用于创建图形用户界面(GUI)的一种库,它为开发者提供了丰富的控件和对话框。在SWT中,`MessageBox`是一个用于显示简单的消息对话框的类,通常用来向用户显示警告、确认...

    swt工具文档 swt工具文档

    4. **可扩展性**: SWT允许开发者创建自定义控件,通过组合现有Widget实现新的功能。 5. **兼容性**: SWT支持多种操作系统,如Windows、Linux、macOS等,为跨平台开发提供了便利。 **使用SWT进行开发** 1. **初始...

    SWT的简单实例

    例如,使用`new Button(parent, SWT.PUSH)`创建一个按钮,`new Text(parent, SWT.SINGLE)`创建一个单行文本框,`new Combo(parent, SWT.READ_ONLY)`创建一个只读的组合框。 3. **事件处理**: SWT通过监听器模型处理...

    Eclipse SWT 开发参考

    - **CCombo组件**:一种增强型的组合框组件。 - **TableEditor组件**:用于编辑表格中的单元格。 #### 5. SWT的组件布局 SWT提供了多种布局管理器,如: - **FillLayout**:填充式布局,使组件填满其容器。 - **...

    SWT widgets基本教程

    ##### 4.5 组合框(Combo) - **Combo** 组件是一个下拉列表。 - 创建组合框: ```java Combo combo1 = new Combo(shell, SWT.DROP_DOWN | SWT.READ_ONLY); combo1.setSize(150, 25); combo1.setLocation(30, ...

    swt小技巧,SWT的SHELL样式

    SWT中的`Shell`样式可以通过组合不同的样式常量来实现。下面是一些常用的样式及其功能介绍: - **SWT.BORDER**:为`Shell`添加一个边框。这通常是默认行为。 - **SWT.CLOSE**:在`Shell`的右上角显示一个关闭按钮。...

    SWT 各种小示例集中

    1. **基础控件**:SWT提供了一系列的基础控件,如按钮(Button)、文本框(Text)、列表(List)、组合框(Combo)、树(Tree)、表格(Table)等。每个控件都有相应的事件监听和方法,例如按钮的点击事件、文本框的文本更改事件...

    SWT开发参考文档

    - **CCombo组件**:组合框,结合了文本输入和下拉列表的功能。 - **TableEditor组件**:允许在表格中编辑单元格。 #### 5. SWT的组件布局 SWT提供了四种主要的布局方式: - **充满式布局**:组件自动扩展以填满...

    swt design for eclipse 3.2

    6. **特性系统**:"features"目录下的内容则是Eclipse的特性(Feature)集合,特性是Eclipse插件的逻辑组合,用于打包和部署。这些特性定义了Eclipse安装或更新时应该包含哪些插件和服务。 7. **国际化与本地化**:...

    Swt的API使用说明

    Swt API提供了多种控件,如按钮(Button)、文本框(Text)、列表(List)、组合框(Combo)、滚动条(ScrollBar)等,这些控件与各个操作系统平台的原生控件保持一致,提供更好的用户体验。例如,`Button`类用于...

    SWT.rar_ java swt_SWT_java swt_java s_java swt

    SWT库提供了丰富的组件,包括但不限于:按钮(Button)、文本域(Text)、组合框(ComboBox)、树视图(Tree)、列表视图(List)、进度条(ProgressBar)等。这些组件允许开发者构建各种复杂的用户界面,满足不同...

    SWT开发组件demo

    1. **基础组件**:SWT的基础组件包括按钮(Button)、文本框(Text)、单选按钮(RadioButton)、复选框(Checkbox)、列表(List)、组合框(ComboBox)等。这些组件在GUI设计中十分常见,是构建用户交互的基本元素...

    SWT教程java开发文档

    4. **Composite**: 用于组合其他Widget的容器,如`Composite container = new Composite(shell, SWT.NONE);` 5. **Table**: 创建表格控件,如`Table table = new Table(shell, SWT.MULTI | SWT.H_SCROLL | SWT.V_...

    swt布局.doc

    在实际开发中,可以根据需求组合使用不同的布局和布局数据。例如,可以创建嵌套的Composites,每个Composite使用不同的布局,以实现复杂的界面结构。同时,布局数据可以设置对齐方式、权重、最小和最大大小等属性,...

    SWT教程

    - **组合框(Combo)**:结合了文本框和下拉列表,用户可以直接输入或从下拉列表中选择。 - **进度条(ProgressBar)**:显示任务的完成进度。 2. **容器控件** - **壳体(Shell)**:作为应用程序窗口的基础,可以...

    SWT常用组件

    - **SWT.RADIO**:单选按钮,通常与其他单选按钮组合使用,以便用户只能选择其中一个。 - **SWT.ARROW**:箭头按钮,常用于导航或控制方向。 - **SWT.NONE**:默认按钮样式。 - **SWT.CENTER/SWT.LEFT/SWT.RIGHT**:...

    org.eclipse.swt包

    - **Composite**: Composite是SWT中的一个关键组件,它允许你组合多个Widget来创建更复杂的布局结构。 - **Layout**: Layout管理器负责控制Composite中的子Widget如何在界面上排列和布局,例如填充、网格、单列等...

    swt/jface.jar

    这些库文件组合在一起,为开发者提供了构建强大、可扩展且跨平台的Java GUI应用程序的工具集。通过SWT,开发者可以利用原生系统资源创建高性能的用户界面,而JFace则进一步抽象了SWT,提供了一套更加面向对象的API,...

    最完美SWT的教程

    - Composite:组合组件,可以包含其他组件,用于构建复杂的布局。 - Shell:顶级窗口,通常作为应用程序的主窗口。 - Menu:菜单,包括下拉菜单和弹出式菜单,用于放置菜单项。 - Tree/ListView:树形视图和列表...

    SWT扩展

    开发者可以根据需求组合这些组件,构建出复杂的应用界面。 **2. 表格与树视图** 在SWT中,`Table`和`Tree`控件提供了数据展示的强大功能。`Table`控件可以用于展示表格数据,支持多列和多种排序方式;`Tree`控件则...

Global site tag (gtag.js) - Google Analytics