학습 곡선 일지 4편: 웹 서비스 액세스 from http://blog.sdnkorea.com/blog/652
예제 그대로 실행해보려 했더니 1.0 대의 API에 없어지거나 변경된 메소드들이 많아서
컴파일이 되는 정도로만 수정
레이아웃은 SequentialCluster등을 몰로 바꾸어야 할 지 몰라서 그냥 좌표로 하드코딩 -_-
Main.fx
/*
* Main.fx
*
* Created on 2009. 1. 17, 오후 8:46:14
*/
package imagesearch;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.ext.swing.SwingLabel;
import javafx.ext.swing.SwingTextField;
import javafx.ext.swing.SwingList;
import javafx.ext.swing.SwingListItem;
import javafx.ext.swing.SwingIcon;
import javafx.ext.swing.SwingButton;
import javafx.scene.paint.Color;
import javax.swing.border.LineBorder;
import javafx.scene.Group ;
import java.lang.System;
/**
* @author bumjin
*/
var searchLabel = SwingLabel {
text: "Search:"
translateX: 10
translateY: 0
};
var searchTextField = SwingTextField {
columns: 30
translateX: 150
translateY: 0
};
var searchButton = SwingButton {
text: "Search"
font: Font {name: "Arial", size: 11}
translateX: 500
translateY: 0
width: 80
height: 22
}
var matchedImageLabel = SwingLabel {
text: "Progress"
translateX: 10
translateY: 40
};
var matchedImagePB = TempProgressBar {
width: 350
translateX: 150
translateY: 40
};
class PhotoList extends SwingList {
public var onChange:function(photo:Photo);
public var selectedPhoto:SwingListItem = bind selectedItem on replace {
var photo = selectedPhoto.value as Photo;
if(onChange!= null) {
onChange(photo);
}
}
}
var thumbnailList = PhotoList {
//hmax: Layout.UNLIMITED_SIZE
//vmax: Layout.UNLIMITED_SIZE
translateX: 10
translateY: 80
width: 300
height: 230
scrollable: true
};
//var selectedImageLabel = SwingLabel {
// translateX: 10
// translateY: 320
// text: "Selected Image"
//};
//var selectedImagePB = TempProgressBar {
// translateX: 150
// translateY: 320
//};
var selectedImageDisplay = SwingLabel {
//hmax: Layout.UNLIMITED_SIZE
//vmax: Layout.UNLIMITED_SIZE
translateX: 320
translateY: 80
width: 300
height: 230
};
// configure the search field
var searcher = ImageSearcher {
callback: function(photos:Photo[]):Void {
thumbnailList.items =
for(photo in photos) {
SwingListItem {
text: photo.title
value: photo
}
};
matchedImagePB.indeterminate = false;
}
};
var search = function():Void {
System.out.println("searching... {searchTextField.text}");
matchedImagePB.indeterminate = true;
searcher.search(searchTextField.text);
};
searchTextField.action=search;
searchButton.action=search;
// configure the image loader
var imageLoader = function(photo:Photo):Void {
if(photo != null) {
matchedImagePB.indeterminate = true;
photo.loadFullImage(function():Void{
selectedImageDisplay.icon = SwingIcon {
image: photo.fullImage };
matchedImagePB.indeterminate = false;
});
}
};
thumbnailList.onChange = imageLoader;
// WORK AROUNDS
selectedImageDisplay.getJComponent().setOpaque(true);
selectedImageDisplay.getJComponent().setBackground(Color.WHITE.getAWTColor());
selectedImageDisplay.getJComponent().setBorder(new LineBorder(Color.BLACK.getAWTColor(), 1, true));
Stage {
title: "Application title"
width: 650
height: 400
scene: Scene {
fill: Color.WHITE
//width: 600
//height: 400
content :[
searchLabel
, searchTextField
, searchButton
, matchedImageLabel
, matchedImagePB
, thumbnailList
// , selectedImageLabel
// , selectedImagePB
, selectedImageDisplay]
}
}
Photo.fx
/*
* Photo.fx
*
* Created on 2009. 1. 17, 오후 8:50:38
*/
package imagesearch;
/**
* @author bumjin
*/
import javafx.scene.image.*;
import java.lang.*;
import javax.swing.SwingUtilities;
import javax.imageio.ImageIO;
public class Photo {
public var id:String;
public var server:String;
public var farm:String;
public var title:String;
public var secret:String;
var image:Image = null;
public var fullImage:Image = null;
public def fullImageURL = bind "http://static.flickr.com/{server}/{id}_{secret}.jpg";
public function loadFullImage(
callback:function():Void
):Void {
if(image == null) {
var thread = new Thread(Runnable {
public override function run():Void {
var strImageUrl = "http://static.flickr.com/{server}/{id}_{secret}.jpg";
System.out.println("loading: {strImageUrl}");
var buffImg = ImageIO.read(new java.net.URL(strImageUrl));
SwingUtilities.invokeLater(Runnable {
public override function run():Void {
image = Image.fromBufferedImage(buffImg);
fullImage = image;
if(callback != null) {
callback();
}
}
});
}});
thread.start();
} else {
callback();
}
}
}
TempProgressBar.fx
/*
* TempProgressBar.fx
*
* Created on 2009. 1. 17, 오후 9:20:09
*/
package imagesearch;
/**
* @author bumjin
*/
import javafx.ext.swing.*;
public class TempProgressBar extends SwingComponent {
protected override function createJComponent():javax.swing.JComponent {
return new javax.swing.JProgressBar();
}
public var indeterminate:Boolean = false on replace {
var prog =
this.getJComponent() as javax.swing.JProgressBar;
prog.setIndeterminate(indeterminate);
}}
ImageSearcher.fx
/*
* ImageSearcher.fx
*
* Created on 2009. 1. 17, 오후 8:48:41
*/
package imagesearch;
/**
* @author bumjin
*/
import javax.xml.parsers.*;
import org.xml.sax.helpers.DefaultHandler;
import java.lang.System;
import java.lang.Thread;
import java.lang.Runnable;
import javax.swing.SwingUtilities;
public class ImageSearcher {
public var callback: function(photos:Photo[]):Void;
public function search(search:String) {
var thread = new Thread(Runnable {
public override function run():Void {
var photos:Photo[];
var handler = DefaultHandler {
public override function startDocument() { }
public override function startElement(
uri:String,
localName:String,
qName:String ,
attributes:org.xml.sax.Attributes ) {
if(qName == "photo") {
var photo = Photo {
id: attributes.getValue("id")
server: attributes.getValue("server")
farm: attributes.getValue("farm")
title: attributes.getValue("title")
secret: attributes.getValue("secret")
};
insert photo into photos;
}
}
public override function endElement(uri:String , localName:String , qName:String ) { }
public override function endDocument() { }
};
var SEARCH_URL = "http://api.flickr.com/services/rest/?"
"method=flickr.photos.search";
var key = "a876089a0c597414e3f6136b68e957e1";
var MAX_IMAGES = 100;
var searchUrl = "{SEARCH_URL}&api_key={key}&per_page={MAX_IMAGES}&text={search}";
var url = new java.net.URL(searchUrl);
var is = url.openStream();
var factory = SAXParserFactory.newInstance();
var saxParser = factory.newSAXParser();
saxParser.parse(is, handler);
SwingUtilities.invokeLater(Runnable {
public override function run():Void {
if(callback != null) {
callback(photos);
}
}
});
}
});
thread.start();
}
}