JavaFXとGoogleMap(3)
前回作ったJXMapViewerを組み込んだJavaFXアプレットをもっとRIA風にしてみた。
また、上部のツールバー部分のドラッグで、アプレットを移動できるようにした。
なお、ButtonとCloseButtonは、JavaFXサンプルサイトのButton.fxとCloseButton.fxを使っている。
(注)6/2に一部修正。
package maptest; import javafx.ext.swing.SwingComponent; import javafx.scene.Group; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.paint.LinearGradient; import javafx.scene.paint.Stop; import javafx.scene.Scene; import javafx.scene.shape.Rectangle; import javafx.scene.transform.Transform; import javafx.stage.AppletStageExtension; import javafx.stage.Stage; import maptest.Button; import maptest.CloseButton; import org.jdesktop.swingx.JXMapKit; import org.jdesktop.swingx.JXMapViewer; import org.jdesktop.swingx.mapviewer.DefaultTileFactory; import org.jdesktop.swingx.mapviewer.GeoPosition; import org.jdesktop.swingx.mapviewer.TileFactoryInfo; var inBrowser = true; public function run(args: String[]){ var stageX = 0.0; var stageY = 0.0; var sWidth=480; var sHeight=320; var stage:Stage; var map=createMap() as JXMapViewer; map.setPreferredSize(new java.awt.Dimension(sWidth,sHeight)); var component=SwingComponent.wrap(map); component.clip = Rectangle { width: sWidth height: sHeight arcHeight: 30 arcWidth: 30 }; var rect=Rectangle { x: 0 y: 4 width: bind sWidth+8 height: 26 arcHeight:5 arcWidth:5 fill:LinearGradient { startX:0.0 startY:0.0 endX:0.0 endY:1.0 proportional:true stops:[ Stop{ offset: 0.0 color: Color.GRAY }, Stop { offset: 0.5 color: Color.BLACK }, Stop { offset: 1.0 color: Color.GRAY } ] } opacity:0.5 onMouseDragged: function(e) { stageX += e.dragX; stageY += e.dragY; } } var home=Button{ translateX: 5 translateY: bind rect.y+3; text: "Home" action: function() { map.setZoom(9); map.setAddressLocation(new GeoPosition(34.683,135.5)); } } var grid=Button{ translateX: bind home.translateX+70 translateY: bind rect.y+3; text: "Grid" action: function() { if(map.isDrawTileBorders()){ map.setDrawTileBorders(false); }else{ map.setDrawTileBorders(true); } } } var close=CloseButton{ visible: true translateX: sWidth - 20 translateY: 12 onMouseClicked: function(e) { stage.close(); } } stage=Stage { title:"MapTest" x: bind stageX; y: bind stageY scene: Scene { fill:Color.NAVY content:VBox{ content:[ Group{ content:[ rect, home, grid, close, ] } VBox{ transforms:Transform.translate(4,8); content:[ component, ] } ] } } extensions: [ AppletStageExtension { shouldDragStart: function(e): Boolean { if(home.hover or grid.hover or close.hover){ return false; }else{ return inBrowser and e.primaryButtonDown and rect.hover; } } onAppletRestored: function() { inBrowser = true; } useDefaultClose: false; } ] } } public function createMap(){ var map=new JXMapViewer() as JXMapViewer; var max=17; var info=new OpenStreetTileFactoryInfo(1,17,17,256,true,true, "http://tile.openstreetmap.org", "x", "y", "zoom"); var tf=new DefaultTileFactory(info); map.setTileFactory(tf); map.setZoom(9); map.setAddressLocation(new GeoPosition(34.6833,135.5)); map.setDrawTileBorders(true); map.setRestrictOutsidePanning(true); map.setHorizontalWrapped(false); var kit=new JXMapKit(); kit.setDefaultProvider(JXMapKit.DefaultProviders.OpenStreetMaps); kit.setDataProviderCreditShown(true); return map; }