一、 添加完成後的最終效果
如圖劃紅線並用紅線圈住的地方,就是狀態欄顯示的踢球信息
二、 讓Eclipse顯示狀態欄
1、 顯示狀態欄
Eclipse的狀態欄默認是不顯示的,所以需要修改ApplicationWorkbenchWindowAdvisor類的preWindowOpen()方法在其中添加。configurer.setShowStatusLine(true);代碼,這樣就可以顯示狀態欄了。
2、 Eclipse狀態欄分類
Elicpse的狀態欄分爲五種:
- Fast Views—Fast Views區域顯示從窗口中刪除的視圖,但可以單擊這一欄停靠的圖標迅速進行訪問
- Icon/Message—-狀態欄共享,任何部分有焦點都可以進行工具
- Progress—-第一個Progress區域用於顯示模型進度。它通常是看不見的,直到IWorkbenchWindow.run()操作被調用。只有在該操作運行時,進度指示器和Cancel按鈕纔可見。
- Contributions—-Contributions區域保留給Workbench顧問和激活部分共享。
- Job Progress—-Job Progress區域默認情況下是隱藏的,但可以通過調用IWorkbenchWindowConfigurator.setShowProgressIndicator(boolean)來被啓動。
各個狀態欄信息在狀態欄中的位置如下圖:
3、 讓狀態欄顯示地球信息
顯示地球信息我們在這裏只關心Contributions狀態欄。爲了是Contributions顯示不是緊貼右邊的邊我們需要讓JobProgress狀態欄也顯示出來,我們需要設置ApplicationWorkbenchWindowAdvisor類的preWindowOpen()方法中設置configurer.setShowProgressIndicator(true),這樣JobProgress就會佔用右邊的一塊位置。
三、 設置地理信息狀態欄
1、 創建ContributionPool類
創建cn.v5cn.swt_wwj.util包,並在其中創建ContributionPool類,源碼如下:
1 |
package
cn.v5cn.swt_wwj.util; |
3 |
import
java.util.HashMap; |
6 |
import
org.eclipse.jface.action.StatusLineContributionItem; |
8 |
public
class ContributionPool { |
9 |
private
final Map<String,StatusLineContributionItem> cmap =
new HashMap<String,StatusLineContributionItem>(); |
11 |
private
static final
ContributionPool cpool = new
ContributionPool(); |
13 |
private
ContributionPool(){} |
15 |
public
static ContributionPool getInstance(){ |
19 |
public
void setContrbution(String key,StatusLineContributionItem item){ |
20 |
if (!cmap.containsKey(key)){ |
25 |
public
StatusLineContributionItem getContrbution(String key){ |
26 |
if (cmap.containsKey(key)){ |
這個類就是一個Contribution池,也就是可以包含多個StatusLineContributionItem對象,該類是一個單例類。
2、 修改ApplicationActionBarAdvisor類
修改完成後的代碼如下:
1 |
package
cn.v5cn.swt_wwj; |
3 |
import
org.eclipse.jface.action.IMenuManager; |
4 |
import
org.eclipse.jface.action.IStatusLineManager; |
5 |
import
org.eclipse.jface.action.StatusLineContributionItem; |
6 |
import
org.eclipse.ui.IWorkbenchWindow; |
7 |
import
org.eclipse.ui.application.ActionBarAdvisor; |
8 |
import
org.eclipse.ui.application.IActionBarConfigurer; |
10 |
import
cn.v5cn.swt_wwj.util.ContributionPool; |
12 |
public
class ApplicationActionBarAdvisor extends
ActionBarAdvisor { |
14 |
StatusLineContributionItem longitude;
|
15 |
StatusLineContributionItem latitude;
|
16 |
StatusLineContributionItem altitude;
|
17 |
StatusLineContributionItem elevation;
|
19 |
public
ApplicationActionBarAdvisor(IActionBarConfigurer configurer) { |
23 |
protected
void makeActions(IWorkbenchWindow window) { |
27 |
protected
void fillMenuBar(IMenuManager menuBar) { |
29 |
longitude =
new StatusLineContributionItem( "longitude" ,
20 ); |
30 |
longitude.setText( "經度:0" ); |
31 |
longitude.setVisible( true ); |
32 |
ContributionPool.getInstance().setContrbution( "longitude" , longitude); |
34 |
latitude =
new StatusLineContributionItem( "latitude" ,
20 ); |
35 |
latitude.setText( "緯度:0" ); |
36 |
latitude.setVisible( true ); |
37 |
ContributionPool.getInstance().setContrbution( "latitude" , latitude); |
39 |
altitude =
new StatusLineContributionItem( "altitude" ,
20 ); |
40 |
altitude.setText( "高度:0千米" ); |
41 |
altitude.setVisible( true ); |
42 |
ContributionPool.getInstance().setContrbution( "altitude" , altitude); |
44 |
elevation =
new StatusLineContributionItem( "elevation" ,
20 ); |
45 |
elevation.setText( "海拔:0米" ); |
46 |
elevation.setVisible( true ); |
47 |
ContributionPool.getInstance().setContrbution( "elevation" , elevation); |
51 |
protected
void fillStatusLine(IStatusLineManager statusLine) { |
54 |
statusLine.add(longitude); |
55 |
statusLine.add(latitude); |
56 |
statusLine.add(altitude); |
57 |
statusLine.add(elevation); |
每一個Contribution就是一個StatusLineContributionItem類的對象,所以在這個類裏面創建了四個StatusLineContributionItem類的對象分別表示經度、緯度、高度和海拔。
makeAction()方法是創建菜單和狀態欄信息的方法,創建是個StatusLineContributionItem對象,傳入ID和字符寬度,並設置他的表示是否顯示。把對象添加的上面創建的池中。fillMenuBar()方法填充菜單和工具欄方法。fillStatusLine()是填充狀態欄使用的方法,所以在這裏添加上面創建的StatusLineContributionItem對象。
3、 運行應用
這個時候大家運行應用程序就會看到顯示到狀態欄中的四個狀態,只是現在還沒有交互
四、 爲狀態欄添加交互
1、 創建StatusBarData類
創建cn.v5cn.swt_wwj.status包,並在其中創建StatusBarData類該類實現PositionListener,RenderingListener兩個接口。代碼如下:
1 |
package
cn.v5cn.swt_wwj.status; |
3 |
import
gov.nasa.worldwind.WorldWindow; |
4 |
import
gov.nasa.worldwind.event.PositionEvent; |
5 |
import
gov.nasa.worldwind.event.PositionListener; |
6 |
import
gov.nasa.worldwind.event.RenderingEvent; |
7 |
import
gov.nasa.worldwind.event.RenderingListener; |
8 |
import
gov.nasa.worldwind.geom.Angle; |
9 |
import
gov.nasa.worldwind.geom.Position; |
10 |
import
gov.nasa.worldwind.util.WWMath; |
12 |
import
java.awt.EventQueue; |
14 |
import
org.eclipse.jface.action.StatusLineContributionItem; |
15 |
import
org.eclipse.swt.widgets.Display; |
17 |
import
cn.v5cn.swt_wwj.util.ContributionPool; |
19 |
public
class StatusBarData implements
PositionListener,RenderingListener { |
21 |
private
WorldWindow dataSource; |
23 |
public
final static
String UNIT_METRIC = "gov.nasa.worldwind.StatusBar.Metric" ; |
24 |
public
final static
String UNIT_IMPERIAL = "gov.nasa.worldwind.StatusBar.Imperial" ; |
26 |
private
String elevationUnit = UNIT_METRIC; |
27 |
private
String angleFormat = Angle.ANGLE_FORMAT_DD; |
29 |
private
ContributionPool cpool = ContributionPool.getInstance(); |
30 |
private
StatusLineContributionItem longitude = null ;
|
31 |
private
StatusLineContributionItem latitude = null ;
|
32 |
private
StatusLineContributionItem altitude = null ;
|
33 |
private
StatusLineContributionItem elevation = null ;
|
35 |
public
StatusBarData(){ |
36 |
longitude = cpool.getContrbution( "longitude" );
|
37 |
latitude = cpool.getContrbution( "latitude" );
|
38 |
altitude = cpool.getContrbution( "altitude" );
|
39 |
elevation = cpool.getContrbution( "elevation" ); |
43 |
public
void stageChanged(RenderingEvent event) { |
44 |
if
(!event.getStage().equals(RenderingEvent.BEFORE_BUFFER_SWAP)) |
47 |
EventQueue.invokeLater( new
Runnable() { |
49 |
if
(dataSource.getView() != null
&& dataSource.getView().getEyePosition() != null ){ |
50 |
Display.getDefault().asyncExec( new
Runnable() { |
53 |
altitude.setText(makeEyeAltitudeDescription(dataSource.getView().getEyePosition().getElevation())); |
63 |
public
void moved(PositionEvent event) { |
65 |
handleCursorPositionChange(event); |
69 |
public
void setDataSource(WorldWindow dataSource){ |
70 |
if (dataSource !=
null ){ |
71 |
dataSource.removePositionListener( this ); |
72 |
dataSource.removeRenderingListener( this ); |
74 |
dataSource.addPositionListener( this ); |
75 |
dataSource.addRenderingListener( this ); |
77 |
this .dataSource = dataSource; |
80 |
protected
String makeCursorElevationDescription( double
metersElevation) { |
83 |
if
(UNIT_IMPERIAL.equals(elevationUnit)) |
84 |
s = String.format(elev +
" %,7d 英尺" ,( int ) (WWMath.convertMetersToFeet(metersElevation))); |
87 |
s = String.format(elev +
" %,7d 米" , ( int ) metersElevation); |
91 |
protected
String makeEyeAltitudeDescription( double
metersAltitude) { |
93 |
String altitude =
"高度:" ; |
94 |
if
(UNIT_IMPERIAL.equals(elevationUnit)) |
95 |
s = String.format(altitude +
" %,7d mi" , ( int ) Math.round(WWMath.convertMetersToMiles(metersAltitude))); |
98 |
s = String.format(altitude +
" %,7d 千米" ,( int ) Math.round(metersAltitude / 1e3)); |
102 |
protected
String makeAngleDescription(String label, Angle angle) { |
104 |
if
(Angle.ANGLE_FORMAT_DMS.equals(angleFormat)) |
105 |
s = String.format( "%s %s" , label, angle.toDMSString()); |
107 |
s = String.format( "%s %7.4f\u00B0" , label, angle.degrees); |
111 |
protected
void handleCursorPositionChange( final
PositionEvent event){ |
112 |
Display.getDefault().asyncExec( new
Runnable() { |
115 |
Position newPos = event.getPosition(); |
117 |
String las = makeAngleDescription( "緯度" , newPos.getLatitude()); |
118 |
String los = makeAngleDescription( "經度" , newPos.getLongitude()); |
119 |
String els = makeCursorElevationDescription(dataSource.getModel() |
121 |
.getElevation(newPos.getLatitude(), newPos.getLongitude())); |
122 |
latitude.setText(las); |
123 |
longitude.setText(los); |
124 |
elevation.setText(els); |
126 |
latitude.setText( "" ); |
127 |
longitude.setText( "" ); |
128 |
elevation.setText( "" ); |
該類包含WorldWindow對象,通過ContributionPool獲得是個StatusLineContributionItem對象,類中最主要的方法是stageChanged()獲得高度值handleCursorPositionChange()獲得海拔、經度和緯度值,值得注意的是兩個方法都有Display.getDefault().asyncExec(new Runnable() {線程包裹這是因爲SWT的UI線程是不允許其他線程信息訪問的。解決這個錯誤就通過添加Display.getDefault.asyncExce(new
Runnable(){ run(){}})加一解決。代碼的其他部分大家可以參考WorldWind源碼中gov.nasa.worldwind.util. StatusBar類。
2、 修改WWJView類
修改WWJView類的createPartControl()方法在方法最後添加new StatusBarData().setDataSource(wwd)這樣就完成了,狀態欄動態顯示地圖狀態信息。
3、 完成後啓動程序,鼠標在地圖上滑動,大家會看到底下狀態欄信息隨之鼠標滑動而改變