Posted title : 태그 : javafx
2009/01/26   [JavaFX] translateX, translateY
2009/01/20   [JavaFX] Migration From Preview Release to JavaFX1.0
2009/01/18   [javaFX] 웹서비스 flickr이미지 검색 어플리케이션
Posted
2009년 01월 26일 Posted title : [JavaFX] translateX, translateY

http://weblogs.java.net/blog/aim/archive/2009/01/layout_primer_f.html

 

상위 노드를 기준으로 상대적으로 원점을 translateX, translateY만큼 이동

 

 

Example 1: Let's look further at these bounds variables using a concrete code example which creates a rectangle.
rectangle1.png
Note that x and y are variables specific to javafx.scene.shape.Rectangle and that they position the rectangle within its own coordinate space rather than moving the entire coordinate space of the node. I throw this out as the first example because it is often the first thing that trips up developers coming from traditional toolkits such as Swing, where changing x,y effectively performs a translation of the component's coordinate space. All of the javafx.scene.shape classes have variables for specifying appropriate shape geometry within their local coordinate space (e.g. Rectangle has x, y, width, height, Circle has centerX, centerY, radius, etc) and such position variables should not be confused with a translation on the coordinate space, as we'll look at in our next example.


Example 2: To translate the rectangle along with its coordinate space (rather than move the rectangle within it), we instead set translateX/translateY, which are variables on Node.
rectangle2.png
Now boundsInParent has changed to reflect the translated rectangle, however boundsInLocal and layoutBounds remain unchanged because they are relative to the rectangle's coordinate space, which was what was shifted.

inside design note: we debated endlessly on whether to rename translateX,translateY to "x","y" (as it's less typing and more familiar to traditional toolkit programming), however we decided that "translate" was more descriptive in the 2D sense and keeping it avoided renaming the x,y position variables in some shape classes.

Posted by 지니랜드 | 2009/01/26 21:12 | 자바 | 트랙백
2009년 01월 18일 Posted title : [javaFX] 웹서비스 flickr이미지 검색 어플리케이션

 

학습 곡선 일지 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();
       }
   }

Posted by 지니짱 | 2009/01/18 15:56 | 자바 | 트랙백
◀ 이전 페이지 다음 페이지 ▶



지니랜드
by 지니랜드
카테고리
전체
프로그래밍
자바
- 이클립스
- 기타언어 (ruby, php)
웹기술 HTML javascript
컴퓨터
- Unix/Linux
- spring
- 테스팅
툴 프로그램 설치
- 버전관리
영어
동영상
영화 책
일상
여행
아무거나
재테크
펀드
미분류
이글루링크
소스코드위를 걷다.....
life logging
거북거북 월드 (ㅡ.-..
아직 열지 않은 선물
All about IT Trends
까먹지말자!
이규영 연예영화 블로그
ok_code 블러그
최근 등록된 덧글
카테고리별로 해당되는 ..
by 지니랜드 at 05/22
이 책들을 다 보면... ..
by 랑우 at 04/14
오지천사님 좋은 정보 ..
by 지니랜드 at 03/16
잠깐지나가다가 들렀습니..
by 오지천사 at 03/09
이런 우연이 ㅎㅎㅎ, 저도..
by 지니랜드 at 03/01
저랑 2개나 같이 들으셨군..
by 상욱 at 03/01
아 그러셨구나.. 오늘 못..
by 지니랜드 at 02/28
ㅎㅎㅎ JCO 오시나 보군요..
by 윤걸 at 02/26
좋은지적 감사드립니다.
by 지니짱 at 09/24
멋진데요? 잘보겠습니다.
by coffeejava at 08/04
FISH RSS
최근 등록된 트랙백
2009 자바 개발자 컨퍼런..
by cutewebi 희정냥★
도서이벤트 4탄 (통계의..
by Korean Healthlog
『프리젠테이션 젠』출간..
by acornLoft
뉴욕의 프로그래머
by The note of Legendre
[책] 뉴욕의 프로그래머
by lovesera.com: ART o..
[행사] 매쉬업 컨퍼런..
by lovesera.com: ART o..
[행사] 매쉬업 엑스..
by lovesera.com: ART o..
루비(Ruby) 설치 및..
by Happy egoist
개발시에 참고하자.. /..
by mcsong's languid aft..
이글루 파인더
라이프로그
프리젠테이션 젠
프리젠테이션 젠

초난감 기업의 조건
초난감 기업의 조건

Stick 스틱!
Stick 스틱!

당신의 기업을 시작하라
당신의 기업을 시작하라

테스트 주도 개발
테스트 주도 개발

조엘 온 소프트웨어
조엘 온 소프트웨어

Head First Design Patterns (Paperback)
Head First Design Patterns (Paperback)

실용예제로 배우는 웹 표준
실용예제로 배우는 웹 표준

아랑은 왜
아랑은 왜

천년전의 글로벌 CEO, 해상왕 장보고
천년전의 글로벌 CEO, 해상왕 장보고

마케팅 천재가 된 맥스
마케팅 천재가 된 맥스

태그
유틸 JCO java JCO10THCONFERENCE 트위터 로드맵 제10회한국자바개발자컨퍼런스 디자인패턴 hangulime 에도가와란포 google space chromeos 할인 추리소설 크롬OS xDBA 영진출판사 db 커맨드패턴 javafx cut 한빛미디어 dodreams 10회JCO컨퍼런스후기 underscore commandpattern 이벤트 자바 파일다운로드
rss

skin by 에셈