可視化(番外篇)——SWT總結


  本篇主要介紹如何在SWT下構建一個應用,如何安裝SWT Designer並破解已進行SWT的可視化編程,Display以及Shell為何物、有何用,SWT中的常用組件、面板容器以及事件模型等。

  1.可視化環境搭建(SWT Designer):

  (1).首先下載SWT Designer插件包SWT Designer 6.9.5 for Eclipse.rar;

  (2).將解壓好的插件包extplugins\swt\eclipse下的features和plugins導入Myeclipse的dropins文件夾下

  SWT Designer 6.9.5 for Eclipse.rar:

  

  Myeclipse的dropins:

  

  (3).下載個注冊機,激活全部可視化編程控件的使用(否則只能使用部分控件)

  

 

  2.Display和Shell

  編寫swt程序的步驟,這些步驟是:

  (1).      創建一個Display對象

  (2).      創建一個或者多個Shell對象,你可以認為Shell代表了程序的窗口。

  (3).      在Shell內創建各種部件(widget)

  (4).      對各個部件進行初始化(外觀,狀態等),同時為各種部件的事件創建監聽器(listener)

  (5).      調用Shell對象的open()方法以顯示窗體

  (6).      各種事件進行監聽並處理,直到程序發出退出消息

  (7).      調用Display對象的dispose()方法以結束程序。

  舉例:

public class TestText {
	public static void main(String[] args) {
		Display display = new Display(); // 創建一個display對象。
		Shell shell = new Shell(display); // shell是程序的主窗體
		shell.setText("文本框示例");
		Text text1 = new Text(shell, SWT.NONE | SWT.BORDER);// 帶邊框
		text1.setBounds(10, 10, 70, 30);
		Text text2 = new Text(shell, SWT.PASSWORD);
		text2.setBounds(90, 10, 70, 30);
		Text text3 = new Text(shell, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
		text3.setBounds(10, 50, 70, 70);
		Text text4 = new Text(shell, SWT.WRAP | SWT.V_SCROLL);
		text4.setBounds(90, 50, 70, 70);
		shell.pack();
		shell.open();
		while (!shell.isDisposed()) { // 如果主窗體沒有關閉則一直循環
			if (!display.readAndDispatch()) { // 如果display不忙
				display.sleep(); // 休眠
			}
		}
		display.dispose(); // 銷毀display
	}
}

  Display是SWT的基礎類,負責在應用程序和本地操作系統之間建立交互;

  一般一個應用程序只要一個Display即可,其用於啟動一個專有的線程,將執行事件循環,並且保持UI線程。

  常用方法:getShells、getPrimaryMonitor等。

 

  Shell是顯示在桌面上的窗口。可以是頂級窗口或是對話框。

  樣式的調整通過構造函數進行設置,比如:Shell shell = new Shell(display, SWT.CLOSE)設置成只顯示關閉標志的Shell窗口。

  如果要使用多個樣式,則需要可以使用“|”運算符進行疊加。

  shell的繼承關系:

  

  一個應用程序中可以創建一個或多個Shell

 

  3.基本組件介紹

  Widget:窗口小部件,Widget類是各種用戶界面元素如按鈕、列表、數和菜單整個繼承體系的父類,抽象類

  ControlsComposites:在SWT中,操作系統控件被定義為抽象類Control的子類,如Button類,Text類等都是Control的子類。

  每個控件都會有自己的父部件,這個父部件可以是Composite類或它的子類,shell也是Composite的子類。

  SWT中控件體系的繼承關系為:

 

   Button:Button分為普通按鈕(SWT.PUSH)、單選按鈕(SWT.RADIO)、多選按鈕(SWT.CHECK)、箭頭按鈕(SWT.ARROW)和切換按鈕(SWT.TOGGLE)

  其樣式包括居中、居左等。

  常用方法:setText、getSelect等

 

  Label:分為文本標簽(SWT.NONE)、分割線標簽(SWT.SEPARATOR)

  Text(文本框):單行、多行、包裹

  其方法有:選中所有字符selectAll、顯示設置的選取文本showSelection、取消所有選擇clearSelection、將選取的字符串復制到剪貼板copy等

  List(列表框):SWT.SINGLE(默認只能選中一個)、SWT.MULTI(可以選擇多行)

  其方法有:添加選項add(String string)、remove(int index)刪除選項

  Combo(組合框):下拉框

 

  4.面板容器類

  Composite(面板類):composite類繼承關系

   

   Group(分組框):分組框是能夠顯示標題分組的面板類

  TabFolder(選項卡):一個TabFolder與多個TabItem進行對應

  常用方法:獲得選項卡數組getItems()、獲得當前選中的選項卡getSelection()等

  CTabFolder(自定義選項卡):功能與TabFolder類似,但是樣式更加豐富,如:  

final CTabFolder tabFolder = newCTabFolder(shell, SWT.CLOSE);

  可以在每個TabItem上顯示關閉窗口。

 

  SashForm(分割窗框):可以將屏幕的區域分成幾部分,並可以通過拖動窗框改變窗口的大小。

  CBanner(自動以分割框):SashForm的變體,有3個控件,分別放在窗口的左側(left)、右側(right)、底部(bottom)。

  ScrolledComposite(滾動面板)。

 

  5.布局管理器

  絕對定位:setBounds(int x, int y, int width, int height)

  托管定位:

  FillLayout(充滿時布局):組件大小相同,不能調節

  RowLayout(行列式布局):可以調整邊距,不會等寬顯示組件,可以折行,設置控件大小RowData

  GridLayout(網格式布局):設置單個控件的大小,使用GridData進行定制控件顯示

  FormLayout(表格式布局):使用FormData和FormAttachment定制控件顯示

  StackLayout(堆棧式布局)

 

  6.事件模型

  監聽器(Listener):接收事件發生的對象,負責處理事件到達后響應事件的代碼。監聽器對應是一個接口,要響應一個事件就要實現該接口中的方法。監聽器類的形式為XXXListener,XXX標示某一類型的監聽器。

  Event(事件):當一個事件到達事件監聽對象時,要攜帶一些該事件所附加的一些信息。

  注冊監聽器

  適配器(這些都是基本概念,不了解的可以百度^_^)

 

  鍵盤事件:e.character(表示輸入字符的Unicode編碼)、e.keyCode(按鍵所對應的ASCII代碼)、e.doit(是否繼續執行此事件,設置為false,則取消該事件)、e.stateMask(按下其他鍵的同時所使用的輔助鍵)

  鍵盤事件舉例:

public class TestKeyListener {

	protected Shell shell;

	/**
	 * Launch the application
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TestKeyListener window = new TestKeyListener();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Open the window
	 */
	public void open() {
		final Display display = Display.getDefault();
		createContents();
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
	}

	/**
	 * Create contents of the window
	 */
	protected void createContents() {
		shell = new Shell();
		shell.setSize(500, 375);
		shell.setText("SWT Application");
		
		Button b = new Button(shell, SWT.PUSH|SWT.WRAP);
		b.setText("有本事,來點我");
		b.setBounds(5, 5, 80, 30);
		b.addKeyListener(new KeyListener() {
			
			@Override
			public void keyReleased(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent arg0) {
				Control control = (Control)arg0.widget;
				Rectangle bounds = control.getBounds();
				
				int bits = SWT.SHIFT|SWT.ALT|SWT.CTRL;
				if((arg0.stateMask & bits)!= 0){
					arg0.doit = false;//取消該事件
					return ;
				}
				
				if(arg0.keyCode == SWT.ARROW_DOWN)
					bounds.y++;
				else if(arg0.keyCode == SWT.ARROW_UP)
					bounds.y--;
				else if(arg0.keyCode == SWT.ARROW_LEFT)
					bounds.x--;
				else if(arg0.keyCode == SWT.ARROW_RIGHT)
					bounds.x++;
				
				if(arg0.character == 'a'){
					System.out.println("您按下的是a鍵");
				}
				
				control.setBounds(bounds);
			}
		});
		
		//
	}

}

  

  鼠標事件:MouseEvent(雙擊)、MouseMoveEvent(移動)、MouseTrackEvent(跟蹤)

  鼠標監聽事件舉例:  

package com.cntrust.test.events;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class TestMouseListener {

	protected Shell shell;
	public Button b ;
	public Shell getShell() {
		return shell;
	}

	public void setShell(Shell shell) {
		this.shell = shell;
	}

	public Button getB() {
		return b;
	}

	public void setB(Button b) {
		this.b = b;
	}

	public MyMouseListener getMml() {
		return mml;
	}

	public void setMml(MyMouseListener mml) {
		this.mml = mml;
	}
	public static MyMouseListener mml ;

	/**
	 * Launch the application
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TestMouseListener window = new TestMouseListener();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Open the window
	 */
	public void open() {
		final Display display = Display.getDefault();
		createContents();
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
	}

	/**
	 * Create contents of the window
	 */
	protected void createContents() {
		shell = new Shell();
		shell.setSize(500, 375);
		shell.setText("SWT Application");
		
		b = new Button(shell, SWT.PUSH);
		b.setBounds(10, 10, 80, 30);
		b.setText("來,拖我一把");
		
		mml = new MyMouseListener();
		b.addMouseListener(mml);
		b.addMouseTrackListener(mml);
		//
	}
	public class MyMouseListener implements MouseMoveListener, MouseListener, MouseTrackListener{

		@Override
		public void mouseMove(MouseEvent arg0) {
			Point point = Display.getCurrent().map(b, shell, arg0.x-10, arg0.y-10);
			Rectangle bounds = b.getBounds();
			b.setBounds(point.x, point.y, bounds.width, bounds.height);
			
		}

		@Override
		public void mouseDoubleClick(MouseEvent arg0) {
			
		}

		@Override
		public void mouseDown(MouseEvent arg0) {
			b.addMouseMoveListener(mml);
			
		}

		@Override
		public void mouseUp(MouseEvent arg0) {
			b.removeMouseMoveListener(mml);

		}

		@Override
		public void mouseEnter(MouseEvent arg0) {
			
		}

		@Override
		public void mouseExit(MouseEvent arg0) {
			
		}

		@Override
		public void mouseHover(MouseEvent arg0) {
			
		}
		
	}

}

  如果覺得有用,歡迎點贊,可誠邀可視化朋友加入群227963113^_^

  本文鏈接《可視化(番外篇)——SWT總結

 

友情贊助

如果你覺得博主的文章對你那么一點小幫助,恰巧你又有想打賞博主的小沖動,那么事不宜遲,趕緊掃一掃,小額地贊助下,攢個奶粉錢,也是讓博主有動力繼續努力,寫出更好的文章^^。

    1. 支付寶                          2. 微信

                      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM