JavaGUI之SWT框架【List】

本文详细介绍了如何在EclipseSWT中使用List组件创建可滚动列表,包括手动布局以实现滚动条,以及通过按钮事件实现在两个List之间的双向数据传输。

List组件

list组件创建

List list = new List(shell, SWT.V_SCROLL);
list.setBounds(10, 10, 100, 180);
for (int i = 0; i < 20; i++) {
	list.add("item: " + i);
}

具体效果如下,创建具有20个item的List,同时具有垂直滚轮
在这里插入图片描述

tip:

  • 值得注意的是,为了创建滚轮样式,我才用了手动布局的方式,用通过setBounds()函数手动设置list大小,才创建出滚轮样式。如果采用了自动布局诸如FillLayout,RowLayout,很可能无法创建出滚轮样式
  • 手动布局,意思就是创建shell时,不设置shell的布局方式。同时也不调用list.pack()。通过setBounds()来设置布局

list样式

样式常量描述效果
SWT.SINGLE单行选择在这里插入图片描述
SWT.MULTI同时选择多行在这里插入图片描述
SWT.H_SCROLL水平滚轮在这里插入图片描述
SWT.V_SCROLL垂直滚轮在这里插入图片描述

List小Demo

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;

public class ListDemo2 {
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setSize(450, 300);
        shell.setText("hello world");

        // 创建leftList
        List leftList = new List(shell, SWT.MULTI | SWT.V_SCROLL);
        leftList.setBounds(10, 10, 100, 180);
        for (int i = 0; i < 20; i++) {
            leftList.add("item: " + i);
        }

        // 创建rightList
        List rightList = new List(shell, SWT.MULTI | SWT.V_SCROLL);
        rightList.setBounds(300, 10, 100, 180);

        // 右移按钮
        Button right = new Button(shell,SWT.ARROW | SWT.RIGHT| SWT.BORDER);
        right.setBounds(200, 50, 30, 30);
        right.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                // 确定leftList中选中的元素
                int[] selectionIndices = leftList.getSelectionIndices();
                // 添加右侧内容
                for (String s : leftList.getSelection()) {
                    rightList.add(s);
                }
                // 删除左侧内容
                leftList.remove(selectionIndices);
            }
        });
        Button left = new Button(shell,SWT.ARROW | SWT.LEFT| SWT.BORDER);
        left.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                // 确定rightList中选中的元素
                int[] selectionIndices = rightList.getSelectionIndices();
                // 添加左侧内容
                for (String s : rightList.getSelection()) {
                    leftList.add(s);
                }
                // 删除右侧内容
                rightList.remove(selectionIndices);
            }
        });
        left.setBounds(200, 100, 30, 30);

        shell.open(); // 启动GUI
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

效果
在这里插入图片描述
demo实现的效果是,点击向右箭头按钮,将左侧选中内容移动到右侧;点击向左按钮,移动右侧选中item。

重要代码解释

// 创建leftList
List leftList = new List(shell, SWT.MULTI | SWT.V_SCROLL);
leftList.setBounds(10, 10, 100, 180);
for (int i = 0; i < 20; i++) {
	leftList.add("item: " + i);
}

// 创建rightList
List rightList = new List(shell, SWT.MULTI | SWT.V_SCROLL);
rightList.setBounds(300, 10, 100, 180);

这段代码创建了两个List,因为他们绑定的父组件shell没有设定layout(布局),因此可以调用setBounds()手动设置list的位置,大小等布局信息。


// 右移按钮
Button right = new Button(shell,SWT.ARROW | SWT.RIGHT| SWT.BORDER);
right.setBounds(200, 50, 30, 30);
right.addSelectionListener(new SelectionAdapter() {
	@Override
	public void widgetSelected(SelectionEvent e) {
		// 确定leftList中选中的元素
		int[] selectionIndices = leftList.getSelectionIndices();
		// 添加右侧内容
		for (String s : leftList.getSelection()) {
			rightList.add(s);
		}
		// 删除左侧内容
		leftList.remove(selectionIndices);
	}
});

创建右移button,设置布局信息,同时绑定监听函数。点击按钮,实现将leftList中的选中内容移动到rightList中。

getSelectionIndices()返回选中内容的下标
getSelection()返回选中的内容
add(String s)添加内容
remove(int[] indices)根据下标删除内容

tip: remove有多个构造函数,按照下标删除速度相对较快


Button left = new Button(shell,SWT.ARROW | SWT.LEFT| SWT.BORDER);
left.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {
        // 确定rightList中选中的元素
        int[] selectionIndices = rightList.getSelectionIndices();
        // 添加左侧内容
        for (String s : rightList.getSelection()) {
            leftList.add(s);
        }
        // 删除右侧内容
        rightList.remove(selectionIndices);
    }
});
left.setBounds(200, 100, 30, 30);

与上个模块类似,移动方向不同,故不再赘述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值