SWT技巧

实现控件的刷新

问题可以简化如下,点击上方按钮,使下方按钮移动,但要求在监听事件里新建按钮对象,而不是使用原来的按钮(原来的按钮被移除了)。

SWT技巧_第1张图片

解决代码如下:

public class TestUI {
	protected Shell shell;
	Composite composite=null;	
	int i=0;
	public static void main(String[] args) {
		try {
			TestUI window = new TestUI();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void open() {
		Display display = Display.getDefault();
		createContents();
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	protected void createContents() {
		shell = new Shell();
		shell.setMinimumSize(new Point(100, 20));
		shell.setMaximumSize(new Point(500, 400));
		shell.setSize(486,143);
		shell.setText("SWT Application");
		shell.setLayout(null);
		update();
		Button button = new Button(shell, SWT.NONE);
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				update();
				i++;
			}
		});		
		button.setBounds(10, 10, 80, 27);
		button.setText("\u79FB\u52A8");
	}
	void update() {
		if(composite!=null)
			composite.dispose();
		composite = new Composite(shell, SWT.BORDER);
		composite.setBounds(10, 43, 450, 52);
		Button btnNewButton = new Button(composite, SWT.NONE);
		System.out.print(i);
		btnNewButton.setBounds(30*i, 10, 29, 27);
	}
}

扩展栏扩展项切换打开关闭

要实现打开一个扩展项时,关闭其他扩展项,需要给扩展栏添加扩展监听器。

SWT技巧_第2张图片

关键代码如下:

expandBar.addExpandListener(new ExpandListener() {		
			@Override
			public void itemExpanded(ExpandEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("expanded");
				for(ExpandItem item:expandBar.getItems()) {
					item.setExpanded(false);//这里循环设置其他扩展项关闭
				}
			}			
			@Override
			public void itemCollapsed(ExpandEvent arg0) {
				// TODO Auto-generated method stub 这个不用管
			}
		});

日期时间设置

DateTime对象的getMonth()方法返回的月份从0(一月)到11(12月)。

设置日期时用setDate(int year,int month,int day)方法比较方便,合法的日期设置不会出现预料之外的结果,month的取值范围在0-11之间。

而如果年月日分别用setYear(),setMonth(),setDay()方法,年份无所谓,但月和日的结果可能受二者的先后次序影响。看如下示例:

DateTime dateTime1 = new DateTime(shell, SWT.BORDER); dateTime1.setBounds(359, 10, 101, 24);
System.out.println(dateTime1.getYear()+"-"+dateTime1.getMonth()+"-"+dateTime1.getDay());
//今天是2023-11-26,getMonth()获得的月份从0开始,上面输出2023-10-26,控件显示2020/11/26
		
dateTime1.setYear(2022); dateTime1.setMonth(11); dateTime1.setDay(31);
System.out.println(dateTime1.getYear()+"-"+dateTime1.getMonth()+"-"+dateTime1.getDay());
//所以上面输出2022-11-31,控件显示2022/12/31

dateTime1.setYear(2022); dateTime1.setMonth(10); dateTime1.setDay(30);
System.out.println(dateTime1.getYear()+"-"+dateTime1.getMonth()+"-"+dateTime1.getDay());
//先设置11月,上一次的31号保持不变。因为11月没有31号,所以月份设置失败,保持12月不变,再设置日期30号,12月有30号,上面输出2022-11-30,控件显示2020/12/30
		
dateTime1.setYear(2021); dateTime1.setMonth(8); dateTime1.setDay(31);
System.out.println(dateTime1.getYear()+"-"+dateTime1.getMonth()+"-"+dateTime1.getDay());
//实际上设置9月31号,Day非法,不改变,只改变年和月.上行输出2021-8-30,控件显示2020/9/30
		
dateTime1.setYear(2020); dateTime1.setMonth(1);	dateTime1.setDay(28);
System.out.println(dateTime1.getYear()+"-"+dateTime1.getMonth()+"-"+dateTime1.getDay());
//这里本想设置2月28号,先设置2月,但由于之前是30号,2月没有30号,所以month不变,day变,输出2020-8-28,控件显示2020/9/28
//但如果先设置Day为28号,再设置setMonth(1),则可以成功,下面输出2020-1-28,控件显示2020-2-28
//dateTime1.setYear(2020); dateTime1.setDay(28); dateTime1.setMonth(1);	
//System.out.println(dateTime1.getYear()+"-"+dateTime1.getMonth()+"-"+dateTime1.getDay());
		
dateTime1.setYear(2019); dateTime1.setMonth(0); dateTime1.setDay(31);
System.out.println(dateTime1.getYear()+"-"+dateTime1.getMonth()+"-"+dateTime1.getDay());
//这里设置1月31号,输出2019-0-31,控件显示2019/1/31

DateTime dateTime2 = new DateTime(shell, SWT.BORDER);
dateTime2.setBounds(359, 40, 98, 24);
dateTime2.setDate(2022, 11, 30);
System.out.println(dateTime2.getYear()+"-"+dateTime2.getMonth()+"-"+dateTime2.getDay());
//上面输出2022-11-30,控件显示2022/12/30
		
dateTime2.setDate(2022, 1, 28);
System.out.println(dateTime2.getYear()+"-"+dateTime2.getMonth()+"-"+dateTime2.getDay());
//上面输出2022-1-28,控件显示2022/2/28,直接用setDate方法则无顺序之分

可以看出,当对月和日分别设置时,就像在拨动一个拨轮日历,同一时间只能调整月份或日期,且一个不能带动另一个。如果从12月31号调整到11月30号,如果先调整月份,日期保持31号,由于11月没有31号,则月份调整失败,保持12月不变,再将日期调整为30号,且月份不再调整。结果为12月30号而非11月30号。要想正确调整,需先将日期从31号调整为30号,再将月份从12月调整为11月。

而采用setDate()方法则一次性调整完成。

Composition类的扩展

Composition对象作为容器用于容纳其他控件,可以将其扩展以做一些初始化操作:

public class OperationComposite extends Composite {
	Statement statement;
	String userState;
	public OperationComposite(Composite parent, int style) {
		super(parent, style);	
	}
	public OperationComposite(Shell shell, Composite parent, int style,String newAccount,String newRole,String tableName,String[] btnStrArray,String[] tableHeadersStrArray,ResultSet resultSet,Statement newStatement) {
		super(parent, style);
		statement=newStatement;
		Composite menuComposite=new Composite(parent, SWT.None);		
		menuComposite.setBounds(10, 10, 722, 35);
		Group group=new Group(parent, SWT.CENTER);
		//group.setText(tableName);
		group.setBounds(10, 51, 722, 243);
	}
	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}
}

Table类的扩展

Table对象用于将数据以表格形式展示,可以将其扩展以完成一些初始化操作:

public class ExtendedTable extends Table{
	String[] headerStrArray;
	String[] contextStrArray= {};
	String contextStr;
	static Shell shell;
	protected void checkSubclass() {        
	    // TODO Auto-generated method stub        
	}
	public ExtendedTable(Composite composite,int i) {
		super(composite, i);
		// TODO Auto-generated constructor stub
	}
	public ExtendedTable(Shell shell,Group group, int style,String newAccount,String newRole,String tableName,String[] headerStrArray,Statement statement,ResultSet resultSet) {
		// TODO Auto-generated constructor stub
		super(group, style);
		//super(shell, style);		
		//Table table=new Table(group, 0);
		setHeaderVisible(true); 
		setLinesVisible(true);
    }
}

你可能感兴趣的:(java,SWT)