반응형

 컨테이너와 배치

u    컨테이너의 이해

Ø      컨테이너는 자신의 영역 안에 다른 컴포넌트를 포함할 있는 컴포넌트를 의미한다.

Ø      컨테이너는 자신만으로는 특별한 동작을 없고, 다른 컴포넌트를 포함할 때만 의미가 있다. 컨테이너 자체도 컴포넌트로 취급되며 다른 컨테이너에 부탁될 있다.

Ø      Panel : 다른 컨테이너에 부착되어 일부 영역을 컨트롤 하는데 많이 사용된다.

Ø      Dialog : 대화창에서 주로 사용되는 컨테이너이다.

Ø      Applet Frame 대표적인 최상위 컨테이너로써 다른 컨테이너를 포함한 바깥쪽 컨테이너를 의미한다.

 

u    컨테이너의 사용

컨테이너

설명

Window

컨테이너

최상위 윈도우를 제공하는 컨테이너, Frame Dialog 컨테이너가 주로 대신 사용됨

메소드 이름

기능

void pack()

배치 관리자를 실행시켜서 포함된 컴포넌트의 배치를 시작하고, 윈도우의 크기를 조절함

void show()

윈도우를 화면에 나타나게 하며 윈도우 중에 가장 맨 상단에 나타나게 한다.

void dispose()

다 사용한 윈도우 리소스를 해제시킨다.

Frame

컨테이너

다른 컨테이너와 마찬가지로 add() 메소드를 사용. 배치 요구.

Frame 클래스 생성 후 setSize() 또는 setBounds() 메소드를 이용해서 크기를 꼭 정해줘야 하며 하부 컴포넌트 배치를 위해 pack() 메소드를 호출하고 마지막으로 setVisible(true) 메소드를 통해 화면에 표시해야 한다.

코드 및 예는 표 하부를 참조할 것

Panel

컨테이너

Applet Frame 클래스가 가장 바깥쪽의 컨테이너 역할을 하는데 반해, Panel 클래스는 컴포넌트들을 그룹별로 모을 때 주로 사용한다. 보통 GUI를 설계할 때 컴포넌트를 독립적으로 Applet Frame에 바로 붙이기 보다는 Panel 클래스에 그룹별로 붙이고 패널 클래스들을 배치하는 경우가 대부분이다.

코드 및 예는 표 하부를 참조할 것

Applet

컨테이너

Applet 클래스는 16장에서 살펴본다.

setSize(), setBounds() 메소드를 해 주어도 원하는 크기대로 웹 브라우저에서 나타나지 않는 경우가 있다. 왜냐면 브라우저의 종류에 따라서 조금씩 차이가 있기 때문에 직접적인 메소드보다는 HTML 태그의 사이즈 부분에 값을 주는 것이 바람직하다.

Dialog

컨테이너

팝업 윈도우의 형태로 메인 윈도우 외에 따로 메시지를 출력하거나, 사용자의 입력을 받을 때 주로 사용되는 컨테이너다.

생성자를 알아보자

형태

기능

Dialog(Frame owner)

Dialog(Dialog owner)

기본 생성자.

Dialog(Dialog owner, String title)

Dialog(Frame owner, String title)

Dialog에 타이틀에 추가

Dialog(Dialog owner, String title, boolean modal)

Dialog(Frame owner, String title, boolean modal)

해당 Dialog를 모달(Modal)로 할 것인지의 여부를 지정함, 모달이란 Dialog가 활성화되어 있을 때는 다른 윈도우를 선택할 수 없는 기능임

Dialog(Frame owner, boolean modal)

상위 컨테이너가 Frame인 경우의 생성자

생성과정

Dialog 클래스 상속 : 상속을 통해서 개발자가 새로운 대화창을 만든다.

super() 를 이용하여 생성자 호출

setVisible() 메소드 호출

코드 및 사용 예는 표 하부를 참조할 것

Ø      Frame 컨테이너 사용

import java.awt.*;

 

public class FrameTest {

       public static void main(String args[]){

             Frame f = new Frame("테스트 프레임");  // 프레임 생성

             Label l = new Label("5 후에 없어지는 프레임");

            

             f.add(l);

             f.setBounds(10, 10, 300, 200); //크기 위치 셋팅

             f.setVisible(true);              // 화면에 나타낸다.

            

             try{

                    Thread.sleep(5*1000);

             }catch(InterruptedException e){}

            

             f.setVisible(false);

            

             f.dispose();               // 자원을 해제한다.

       }

}

<실행결과>

Ø      Panel 컨테이너 사용

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

 

public class PanelTest extends Applet implements ActionListener{

       Panel panel1, panel2;

       Button button1, button2, button3, button4;

      

       public void init(){

             panel1 = new Panel();

             panel2 = new Panel();

            

             panel1.setBackground(Color.red);

             panel2.setBackground(Color.yellow);

            

             add(panel1);

             add(panel2);

            

             button1 = new Button("패널 2 보이기");

             button2 = new Button("패널 2 안보이기");

             button3 = new Button("패널 1 보이기");

             button4 = new Button("패널 1 안보이기");

            

             button1.addActionListener(this);

             button2.addActionListener(this);

             button3.addActionListener(this);

             button4.addActionListener(this);

            

             panel1.add(button1);

             panel1.add(button2);

             panel2.add(button3);

             panel2.add(button4);

       }

      

       // 버튼이 눌리면 actionPerformed() 메소드가 호출된다.

       public void actionPerformed(ActionEvent ae){

             Button b = (Button)ae.getSource();

            

             String label = b.getLabel();

            

             if(label.equals("패널 1 보이기"))

                    panel1.setVisible(true);

             else if(label.equals("패널 1 안보이기"))

                    panel1.setVisible(false);

             else if(label.equals("패널 2 보이기"))

                    panel2.setVisible(true);

             else

                    panel2.setVisible(false);

       }

}

<실행결과>

Ø      Dialog 컨테이너 사용

<Notification.java>

import java.awt.*;

import java.awt.event.*;

 

class Notification extends Dialog implements ActionListener{

      

       String msg;

      

       public Notification(Frame f, String s){

             super(f,"주목",true);

             msg = s;

       }

      

       public void disp(){

             Button b;

            

             add("North", new Label(msg,Label.CENTER));

            

             b = new Button("OK");

             b.addActionListener(this);

            

             Panel p = new Panel();

             p.add(b);

             add("South", p);

             setBackground(Color.gray);

             setSize(160,100);

             setVisible(true);

       }

      

       public void actionPerformed(ActionEvent e){

             dispose();

       }

}

 

<TestDialog.java>

import java.awt.*;

import java.awt.event.*;

 

class TestDialog extends Frame implements ActionListener{

             Notification n;

            

             public TestDialog(){

                           super("다이얼로그를 테스트합니다.");

                          

                           n = new Notification(this,"다이얼로그가 보입니다");

                          

                           Panel p = new Panel();

                           Button b1 = new Button("다이얼로그 열기");

                           b1.addActionListener(this);

                          

                           p.add(b1);

                          

                           add(p);

                          

                           setSize(300,150);

                           setVisible(true);

             }

            

             public void actionPerformed(ActionEvent e){

                           n.disp();

             }

            

             public static void main(String args[]){

                           TestDialog t = new TestDialog();

             }

}

<실행결과>

 

u    배치에 대한 이해

Ø      문제 분석 : GUI에서 화면을 구성하기 위해서는 컴포넌트의 위치를 좌표로 지정해 주었다. 다른 운용체제에서 절대 좌표를 입력하면 다르게 표시되어 원하는 모습이 나오지 않는다. 또한 컨테이너의 사이즈를 재조정하면 안에 들어 있는 컴포넌트의 위치가 제각각 변하기 때문에 배치 개념이 나옴

Ø      문제 해결 : 플랫폼 독립성의 특징을 이용해 컴포넌트의 배치를 배치 관리자(Layout Manager)라는 것을 이용하여 처리하도록 한다. 배치 관리자는 LayoutManager 인터페이스를 반드시 구현하도록 되어 있는데 배치 관리자를 통해 컴포넌트를 영역에 배치한다.

Ø      컨테이너가 배치 관리자에게 컴포넌트를 배치하는 것을 요청하면 컴포넌트 간의 간격이나 컴포넌트의 크기 등의 윈도우 시스템에 종속적인 값을 배치 관리자가 하위 윈도우 시스템에 가장 적합한 값으로 매핑해서 화면에 보여준다.

Ø      디폴트 배치 관리자

컨테이너

배치 관리자

Applet, Panel

FlowLayout

Window, Frame, Dialog

BorderLayout

Ø      자바의 컨테이너가 배치 관리자를 사용하기 위한 절차

① 필요한 배치를 지원하는 배치 관리자 클래스 객체를 생성

② 배치 관리자 클래스를 컴포넌트의 setLayout() 메소드를 이용하여 컨테이너에 설정

③ 이후 add() 메소드로 추가되는 컴포넌트는 설정된 배치 관리자 클래스에

 

u    Flow 레이아웃

Ø      컨테이너에 주어진 컴포넌트를 왼쪽에서 오른쪽으로, 위에서 아래쪽으로 순차적으로 배열한다.

Ø      배치시 주의점은 컴포넌트가 지정한 크기를 무시하고 컴포넌트에 필요한 최소한의 높이와 위치, 간격이 자동적으로 지정되어 배치된다.

Ø      코드는 생략하고 실행결과와 특징변화의 예시를 보자.

<실행결과>

      (기본모습)                 (옆으로 윈도우를 늘렸을 )

 

u    Border 레이아웃

Ø      배치에는 North, East, South, West, Center 이름이 붙어 있다.

Ø      이름은 컴포넌트를 컨테이너에 포함시킬 , 같이 주어지며 이에 의해서 컴포넌트가 포함되는 위치가 정해진다.

Ø      소스 코드 실행 결과

import java.awt.*;

 

public class BorderTest extends Frame{

      

       public static void main(String args[]){

             BorderTest f = new BorderTest();

            

             f.setLayout(new BorderLayout());

            

             f.add("North", new Button("첫번째"));

             f.add("East", new Button("두번째"));

             f.add("West", new Button("세번째"));

             f.add("South", new Button("네번째"));

             f.add("Center", new Button("다섯번째"));

            

             f.setSize(300,300);

             f.setVisible(true);

       }

}

<실행결과>

 

u    Grid 레이아웃

Ø      그리드 레이아웃은 생성할 컬럼수와 라인수를 지정한다.

Ø      레이아웃에서는 배치되는 컴포넌트의 크기와 상관없이 셀의 크기와 고정적이기 때문에 컴포넌트의 사이즈가 완전히 무시된다. 컴포넌트를 추가하면 좌측에서 우측으로, 상단에서 하단의 순서대로 컴포넌트가 추가된다.

Ø      소스 코드 실행 결과

import java.awt.*;

 

public class GridTest extends Frame{

      

       public static void main(String args[]){

             GridTest f = new GridTest();

             

             f.setLayout(new GridLayout(3,2));

            

             f.add("North", new Button("첫번째"));

             f.add("East", new Button("두번째"));

             f.add("West", new Button("세번째"));

             f.add("South", new Button("네번째"));

             f.add("Center", new Button("다섯번째"));

            

             f.setSize(300,300);

             f.setVisible(true);

       }

}

<실행결과>

 

u    Card 레이아웃

Ø      카드를 포개어 놓은 듯한 레이아웃 형태로서 포개 놓으면 위의 카드밖에는 없듯이 배치 관리자를 쓰면 한번에 하나의 컴포넌트밖에는 없다.

Ø      소스 코드 실행결과

import java.awt.*;

import java.awt.event.*;

 

public class CardTest extends Frame implements ActionListener{

            

             CardLayout cl;

            

             public static void main(String args[]){

                           CardTest f = new CardTest();

                           Button b;

                          

                           f.cl = new CardLayout();

                           f.setLayout(f.cl);

                          

                           b = new Button("첫번째");

                           b.addActionListener(f);

                           f.add("1,", b);

                          

                           b = new Button("두번째");

                           b.addActionListener(f);

                           f.add("2,", b);

                          

                           b = new Button("세번째");

                           b.addActionListener(f);

                           f.add("3,", b);

                          

                           b = new Button("네번째");

                           b.addActionListener(f);

                           f.add("4,", b);

                          

                           b = new Button("다섯번째");

                           b.addActionListener(f);

                           f.add("5,", b);

                          

                           f.setSize(300,300);

                           f.setVisible(true);

             }

            

             public void actionPerformed(ActionEvent e){

                           cl.next(this);

             }

}

<실행결과>

 ( 화면)                             ( 화면 클릭 두번째 화면)



 

u    GridBag 레이아웃

Ø      지정된 사이즈를 좌표를 이용해 영역 구분을 해준다.

Ø      소스 코드 실행 결과

import java.awt.*;

import java.util.*;

 

public class GridBagTest extends Panel{

            

             GridBagConstraints c;

            

             public GridBagTest(){

                           GridBagLayout gridbag = new GridBagLayout();

                           setLayout(gridbag);

                           setBackground(Color.red);

                          

                           c = new GridBagConstraints();

                           c.weightx = 1.0;

                           c.weighty = 1.0;

                           c.fill = GridBagConstraints.BOTH;

                          

                           layout(new Button("첫번째"), 0,0,1,2);

                           layout(new Button("두번째"), 2,0,2,1);

                           layout(new Button("세번째"), 1,1,1,1);

                           layout(new Button("네번째"), 2,1,1,1);

             }

            

             public void layout(Component obj, int x, int y, int width, int height){

                           c.gridx = x;

                           c.gridy = y;

                           c.gridwidth = width;

                           c.gridheight = height;

                           add(obj, c);

             }

            

             public static void main(String args[]){

                           Frame test = new Frame();

                           test.setSize(300,300);

                           test.add(new GridBagTest());

                           test.setVisible(true);

             }

}

<실행결과>

출처 : Tong - winshwin님의 + [JAVA/JSP]통

반응형

<Visual C++의 유용한 단축키> : Help->Keyboard Map 참고

줄넘버 보여주기 :

도구 > 옵션 > 텍스트편집기 > 모든언어 > 자동줄번호 선택.

 

<이동>-------------------------------------------------

Ctrl + F2               현재 라인에 북마크 지정/해제

F2                       지정된 다음 북마크로 이동

Ctrl + Shift + F2      지정된 모든 북마크를 해제

Ctrl-K, Ctrl-H         바로가기 설정. ( 작업목록 창에서 확인가능 )

Ctrl-K,K                북마크 설정 / 해제

Ctrl-K,L                북마크 모두 해제

Ctrl-K,N                북마크 다음으로 이동

Ctrl-K,P                북마크 이전으로 이동

Ctrl-K,C                선택한 블럭을 전부 코멘트

Ctrl-K,U                선택한 블럭을 전부 언코멘트(코멘트 해제)

Ctrl + ] 또는 E        {괄호의 짝을 찾아줌

Ctrl + J, K              #ifdef #endif의 짝을 찾아줌

Ctrl+ -, Ctrl+Shift+ -

현재 커서를 기억하는 Ctrl+F3(VS6에서), Ctrl+K,K(VS7에서) 와는 달리 사용자가 별도로 입력을 해주는건 없고, 단지 이전에 커서가 있었던곳으로 위 키를 누를 때마다 이동된다. (shift를 이용하면 역순)

 

Ctrl-F12                커서위치 내용의 선언(.h)으로 이동

F12                      커서위치 내용의 정의(.cpp)로 이동

Shift+Alt+F12         빠른기호찾기

 

Ctrl-Shift-G           #include "파일명" 파일로 바로 직접이동

F8                       After a build failure hit

Shift+F8            거꾸로

Ctrl + D                툴바의 찾기 Editbox로 이동 

 

<편집>-------------------------------------------------

Ctrl-F                   찾기 대화상자

Ctrl-H                  바꾸기 대화상자

Ctrl-Shift-F           파일들에서 찾기 대화상자

Ctrl-Shift-H           파일들에서 바꾸기 대화상자

Ctrl-G                  해당 줄로 가기 (별로 필요없음)

Ctrl-K,Ctrl-F          선택된 영역 자동 인덴트 (VS6 Alt-F8기능)

Ctrl-Shift-Spacebar             함수와매개변수설명이 안나올경우, 강제로 나오게

Ctrl+Alt+T

Ctrl+Spacebar       멤버목록 팝업창이 나타납니다

Ctrl+Shift+R           (키보드 레코딩)

             가끔 연속된 연속기만으로는 부족한경우가 있다.

             이때 Ctrl+Shift+R 을 누르고, 원하는 동작들을 수행후,

다시 Ctrl+Shift+R을 눌러 종료한다. 

이 중간동작을 원하는 위치에서 반복하고 싶다면

             Ctrl+Shift+P 를 누른다.

 

Ctrl+Shift+V           (히스토리 붙이기)

Ctrl-Z                  이전으로 되돌리기

Ctrl-Shift-Z           되돌렸다, 다시 복구하기

Ctrl + I                  문자열 입력, 점진적으로 문자열 찾기

Ctrl + F3               현재 커서에 있는 문자열 찾기

Ctrl+Shift+F3          거꾸로 찾기

F3                       찾은 문자열에 대한 다음 문자열 (Next Search)

Ctrl + H                 문자열 찾아 바꾸기 (Replace)

Ctrl + Left/Right     단어 단위로 이동

Ctrl+[Delete|Backspace] 단어 단위로 삭제

Ctrl + L                 한 라인을 클립보드로 잘라내기

Ctrl + Shift + L       한 라인을 삭제

Alt + Mouse          세로로 블록 설정하기 (마우스로)

Ctrl + Shift + F8      세로로 블록 설정하기 (키보드로),

취소할 때는 Esc키를 눌러야 함

블록설정>>Tab       선택된 블록의 문자열을 일괄적으로 들여쓰기(Tab)

블록설정>>Shift + Tab선택된 블록의 문자열을 일괄적으로 내어쓰기

Alt+F8>> [Tab|Shift + Tab]

                          들여쓰기 자동 조정

Ctrl + T                 현재 커서에 있는 변수/함수에 대한 Type

Tooltip 힌트 창에 나타남

Ctrl + Alt + T          멤버 변수/함수 목록에 대한 팝업 창이 나타남

Ctrl + Shift + T       공백/콤마/파이프/괄호 등을 기준으로

좌우 문자열을 Swap시킴

Ctrl + Shift + 8       문단기호 표시/감추기 :

Tab ^, Space .으로 표시

Ctrl + D                 툴바의 찾기 Editbox로 이동

Ctrl + Up/Down      커서는 고정시키고 화면만 스크롤 시키기

CTRL+SHIFT+T       커서 위치의 단어와 앞 단어가 서로 교체

ALT+SHIFT+T         커서 위치의 한줄과 윗줄이 서로 교환

Ctrl + Shift + U       소문자가 대문자로 둔갑.

Ctrl + U                 대문자를 소문자로 변경

Ctrl + Shift + F8      블럭설정

Ctrl + C, C                          That copies the current line.

Ctrl+K, Ctrl+C                      Automatically commented.

Ctrl+K, Ctrl+U                      Uncommented.

 

<디버그/빌드>-------------------------------------------

F5                       디버그 시작

F9                       디버그 브렉포인트 지정/해제

Ctrl-F9                 현위치 설정된 브렉포인트 해제

Ctrl-Shift-F9         현재 소스파일에 지정된 모든 Breakpoint 해제

Shift-F5               디버그 빠져나오기

Ctrl-F10                커서가 있는곳까지 실행

Shift-F11                           현 함수를 빠져나감.

 

Shift+Ctrl+B           전체 빌드(프로젝트가 여러개있을경우 모두 빌드)

Alt+B, C                해당 프로젝트만 정리.

Alt+B, U                해당 프로젝트만 빌드.

Ctrl-F7                 현 파일만 컴파일    : 현 프로젝트만 빌드

Ctrl-F5                 프로그램 시작

Shift + F9                           디버그 모드에서 추가하고픈 변수나 등등

앞에 커서를 위치 시킨후 Shift+F9를 누르면

Watch Window에 자동으로 추가.

 

<창관련>-----------------------------------------------

Shift+Alt+Enter       전체 창 (토글 됨)

F4                       속성창 보여준다.

Ctrl+Alt+X                           리소스에디터 툴박스창

Ctrl+Alt+K              작업목록 창.

Ctrl + Tab                           Edit하고 있는 Child Window 간의 이동

Ctrl + F4               현재 Edit하고 있는 Child Window를 닫기

Ctrl-M, Ctrl-L         소스파일의 함수헤더만 보이기 (구현부는 감추고)

Ctrl-M, Ctrl-M        현재 커서가 위치한 함수를 접는다/편다. (토글 키)

Ctrl+R, Ctrl+R         Word Wrap

Ctrl+M+L               편집.전체개요표시숨기기

 

Ctrl+M+H           편집.선택영역숨기기

Ctrl+M+U           편집.현재숨기기중지

 

Alt + F7                Project Setting

반응형

* Layout Manager


1. FlowLayout : Panel, Applet의 default Layout manager

     - Component를 왼쪽에서 오른쪽으로 배치

     - Default로 component를 Frame의 중앙에 배치

     - Component의 size는 layout maneger가 결정

     - Layout Manager의 Constructor를 이용하면 Manager의 속성을 변경할 수 있다.


     ex) setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 40))

          Component를 오른쪽에 배치하며, 20은 Component간의 좌우 Gap을 지정하며, 40은

          Component간의 상하 Gap을 지정하는 것이다. 단위는 pixel.


2. BorderLayout : Window, Frame의 default manager

     - Component를 East, West, North, South, Center 다섯군데에 배치

     - f.add(bn, BorderLayout.NORTH)    f.add(bn, NORTH)   둘 다 버튼을 북쪽에 배치

     - 위치를 지정하지 않으면 Center에 겹쳐 나타나게 된다.


3. GridLayout

     - 격자를 만들어 그 위에 Component를 배치

     - Component를 추가하면 왼쪽에서 오른쪽으로, 위쪽에서 아래쪽으로 배치

     - Constructor를 통해 격자의 크기 결정가능.


4. CardLayout

     - 여러장의 카드(Panel로 구성)를 겹쳐놓고 필요에 따라 그 카드를 보여줌


5. GridBagLayout

     - GridLayout과 비슷하나 더 복잡

반응형
:: 2007년 08월 22일 ::

  Weekly Highlight
[로보코드 특집] 로보코드 코리아컵 2007이 성황리에 종료되었습니다. 행사 스케치를 통해 현장의 열기를 느껴보시고 16강 진출자들의 로봇 전략과 소스 코드도 다운받아 보세요.
한국 developerWorks 2007년 7월 TOP 10 인기자료가 업데이트 되었습니다.
   Local Contents
“다방면에 박식한 아마추어” - PyPy, FePy, IronMonkey 개발자, 서상현 님 (dW Interview)
서로의 가치를 배가하는 VM 기술과 스크립트 언어-김도형 (dW column)
여름나기 책 2선: OS와 최적화의 상승 작용 엿보기 - 박재호 (개발자 책꽂이)
   최신 기술자료 (한글)
Lotus Sametime용 Acronym Expander 구현하기 [Lotus]
리스너 클래스를 만들고 중개 기능을 제공하는 Lotus Sametime Connect용 Acronym Expander를 개발합니다.
사람을 위한 자동화: 아키텍처 건전성 [자바]
적극적인 빌드 프로세스를 사용하여 아키텍처를 관리합니다.
JsonML 이해하기 [XML]
JsonML은 JSON의 확장으로서 JSON 유형 마크업을 사용하여 XML 데이터를 매핑할 수 있고, JSON 마크업에 기반하여 XML이나 XHTML 데이터를 쉽게 생성하고 사용자 인터페이스 엘리먼트들을 구현 및 교환할 수 있습니다.
서비스 지향 아키텍처로 웹 서비스 비전 확대하기, Part 1 [SOA와 웹서비스]
오늘날의 웹 서비스는 일반적으로 간단하고 클라이언트 측 모델과 비슷합니다. 필자는 단순한 모델에서 복잡한 실제 모델로 옮겨갈 문제점을 설명하고 있습니다.
한번에 Eclipse 확장 구현하기 [오픈 소스]
개발팀이 표준을 따르고 시간을 절약할 수 있게 만드는 코드 플러그인을 생성하는 방법을 설명합니다.
Ajax로 SOAP 웹 서비스 호출하기, Part 1: 웹 서비스 클라이언트 구현 [SOA와 웹서비스]
Asynchronous JavaScript and XML (Ajax) 디자인 패턴을 사용하여 웹 브라우저 기반 SOAP 웹 서비스를 구현해봅시다.
   기획 기사
SOA 복합 비즈니스 서비스 구현하기
이번 기획 기사에서는 SOA 서비스들을 조합하는데 필요한 요소를 시작으로 IBM WebSphere 솔루션을 이용해 SOA 복합 비즈니스를 구현하는 기법을 알아보고 빌드 전개 등 전 과정을 살펴보겠습니다.
   최신 튜토리얼 (한글)
XForms를 사용하여 회계 도구 만들기, Part 5: 부채 관리 기능 개발하기 [오픈 소스]
본 Part 5에서는 부채를 위한 채무 폼을 만드는 방법과 청구 데이터와 통계자료를 분석할 보고 폼을 만드는 방법에 대해 다룰 것입니다.
소개: 이클립스 테스트/성능 도구 플랫폼 [웹 개발]
자바 애플리케이션 프로파일링을 위해 Eclipse Test & Performance Tools Platform를 어떻게 사용하는지와 메모리 사용량을 측정하고, 메모리 누수를 확인하며, 성능 병목을 없애는 법을 배우겠습니다.

  Lotus 행사 안내

IBM Lotus Collaboration Summit에 초대합니다.
반응형
 

GUI - AWT : 이벤트처리

     - SWING : 컴포넌트

◈ AWT ◈

 ▷ 하나의 코드를 가지고 여러 OS에서 동일한 형태로 실행이 되어야 하기 때문에 특정 OS에서만 제공한하는 GUT컴포넌트는 AWT에서 포함시킬수없다.

 ▷ OS에 종속됨

◈ Swing(스윙) ◈

 ▷ 스윙은 AWT의 단점을 보안. 개발된 자바 라이브러리.

 ▷ 스윙의 장점은 코드전체가 자바로 되어있어서 OS에 종속되는 부분이 없다.

    OS에 종속되는 부분이 없어 기존의 컴포넌트를 확장가능.

 ▷ 스윙으로 작성한 코드는 OS에 상관없이 어디서나 동일한 결과가 나온다.

    AWT에 있는기능은 스윙에 있지만 스윙에 있는 기능은 AWT에 없다.


◆ Component ◆

  └ 스윙의 컴포넌트는 대부분 javax.swing.JComponent클래스를 상속방아 사용.

  └  JComponent클래스는 AWT의 java.awt.Container를 확장한 클래스  

       Component      <====     Container    <====     JComponent

       (java.awt)                   (java.awt)                (javax.sing)


◆ JComponent ◆

  └ 툴팁(ToolTip)

     - 모든 컴포넌트에서는 풍선 도움말을 작성 할 수 있다.

        풍선도움말을 컴포넌트 위에 마우스를 올려 놓았을 때 도움말이 나타나게 된다.

     - 툴팁 텍스트를 설정하려면 selToolTipText메소드를 이용.

         public void setToolTipText(String tooltipMessage)

  └ 더블버퍼링 =>깜빡거리는 형상을 줄임.

     - 스윙에서 자체적으로 지원.

  └ 테두리(Border) : 컴포넌트의 테두리를 임의의 형태로 작성.

      - 컴포넌트에 테두리를 변경하고 싶다면

         public void setBorder(Border border)


◆ Container ◆ 

  └ 컨테이너는 다른 컴포넌트를 담기 위해 특화된 컴포넌트로 각 컨테이너마다 컴포넌트를 담는 방식.

  └ 컨테이너는 AWT의 컨테이너를 상속받아 구현된 최상의 컨테이너와 JComponent를 상속받아서 구현된 일반컨테이너와 구분

  └ 최상의 컨네이너 구조(JWindow, JDialog, JApplet, JFrame)이 있는데 각각의 AWT의 Window,Dialog,Frame을 상속받아서 구현한 컨테이너이다.

  └ 최상위 컨테이너는 Swing's GUI Application Program을 할 때 최소한 한개 이상을 가지고 있다.

  └ 최상위 컨테이너는 컴포넌트를 직접적으로 추가하지 않고, 포넌트의 추가/삭제를 JRootPane클래스에 위임하는 구조를 갖는다.
   - layerdPane에는 ContentPane하고 GlassPane이 있고, LayerPane은 RootPane에 붙고 RootPane은 Frame에 붙는다.

   - 컴포넌트를 붙일때는 ContentPane에 붙인다.

 ===================================================================                            

    **최상에는 JFrame이 있다.

==================================================================

awt는 바로 frameㅇ을 content를 붙이지만 swing에서는 JFrame에 JComponent를 추가 할 수 없다.

왜냐하면 컴포넌트의 추가/삭제는 JRootPane에 위임하기 때문이다.

따라서 대부분의 컴포넌트는 ContentPane에 추가/삭제하도록 되어있다.


 ⊙ setSize(400,500);

   └ JFrame에 width와 height를 지정한다. -setSize는 프레임의 크기
 ⊙ pack();
   └ pack() 컴포넌트 크기만큼 JFrame의 사이즈를 구성한다.
 ⊙ setLocation(500,500);

    └ JFrame에 시작 위치(width,height)를 지정.
 ⊙ setBounds(500,500,400,500);

    └ 크기와 위치를 동시에 지정 -setBounds(setSize,setLocation);
 ⊙ setVisible(true);

    └ JFrame을 보여주는지를 지정. true=>보여준다 / false=>보여주지 않는다.
 ⊙ setDefaultCloseOperation =>JFrame 종료 할때 어떤 동작할 것인가를 지정
       <옵션>
           └ DO_NOTHING_ON_CLOSE : 종료를 눌렀을때 아무 동작도 하지 말아라.
           └ HIDE_ON_CLOSE (default) :프로그램 종료 하지 않은 상태에서 숨어있어라.
           └ DIPOSE_ON_CLOSE : 현재프레임만 종료하라.
           └ EXIT_ON_CLOSE  : 모든 프레임을 종료하라.
 ⊙ setResizable(true);
    └ 프레임의 크기를 고정할 것인가 를 지정. true=>사이즈를 변경 가능. false=> 사이즈 변경 불가능.
 ⊙ JFrame.setDefaultLookAndFeelDecorated(true);
    └ JFrame을 JAVA LookAndFeel로 바꿔주는 메소드. 만약 false일경우 자바로 변경이 안됨.
   주의) JFrame 객체가 생성되기 이전에 호출되어야 한다.


   ex> public static void main(String[] args){
          JFrame.setDefaultLookAndFeelDecorated(true);
           new JFrameDemo("프레임 테스트");
         }

======================jframe을 상속받은 경우============================

package swing;
import java.awt.*;
import javax.swing.*;
public class JFrameDemo extends JFrame{
 public JFrameDemo(String title){
  super(title);
  JButton jbtn=new JButton("테스트");
  Container contentPane=getContentPane();
  contentPane.add(jbtn);
  setSize(400,500);
  setLocation(500,500);
  setVisible(true);
  setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
  setResizable(true);
 }
 public static void main(String[] args){
  JFrame.setDefaultLookAndFeelDecorated(true);
  new JFrameDemo("프레임 테스트");
 }
}


===========================jframe을 상속 받지 않은 경우========================

package swing;
import java.awt.*;
import javax.swing.*;
public class JFrameEx {
 public JFrameEx(String title){
  //부모가 없어지면 new를 통해 부모를 생성하고
  // 부모가 사용했던 래퍼런스는 부모.래퍼런스로 접근해주면 된다.
  JFrame jframe=new JFrame(title);
  JButton jbtn=new JButton("테스트");
  Container contentPane=jframe.getContentPane();
  contentPane.add(jbtn);
  jframe.setLocation(500,500);
  jframe.setVisible(true);
  jframe.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
  jframe.setResizable(true);
 }
 public static void main(String[] args){
  JFrame.setDefaultLookAndFeelDecorated(true);
  new JFrameDemo("프레임 테스트");
 }
}

===================================================================

반응형
import java.awt.*;
import java.io.File;
class FrameTest
{
    public static void main(String args[]){
        Frame f = new Frame();
        f.setTitle("Frame Test");
        f.setSize(200,200);
        f.setResizable(false);
 
        Image icon = f.getToolkit().getImage("Photo0007.jpg");
        f.setIconImage(icon);
        f.setVisible(true);
    }
};
반응형
///////////////////////////////////////////////////////////////

java 프레임 타이틀바 없애기..

import javax.swing.*;
import java.awt.*;
public class NoTitleBarFrameTest {
 public static void main(String[] args) {
  JFrame f = new JFrame();
  f.setUndecorated(true);
  f.setSize(300,300);
  f.setVisible(true);
  //JWindow w = new JWindow();
  //w.setSize(300,300);
  //w.setVisible(true);
 }
}

setUndecorated 메소드를 사용해 보세요. 주의점을 setVisible(true) 전에 해야 한다는 것입니다.


또는 JFrame 대신 JWindow를 사용하시던지요. (밑에 주석 처리한 것입니다.)

반응형

풀스크린 윈도우 (FullScreen Window) 만들기

import
 java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FullScreen1 {
  GraphicsDevice device;

  public FullScreen1() {
    GraphicsEnvironment ge = GraphicsEnvironment
        .getLocalGraphicsEnvironment();
    device = ge.getDefaultScreenDevice();
    GraphicsConfiguration gc = device.getDefaultConfiguration();

    try {
      JFrame frame = new JFrame(gc);
      //프레임의 테두리를 없앤다.
      frame.setUndecorated(true);

      JButton button = new JButton("OK");
      button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          device.setFullScreenWindow(null);
          System.exit(0);
        }
      });

      frame.getContentPane().add(button);
      //frame을 스크린에 가득차도록 풀스크린 윈도우로 만듬
      device.setFullScreenWindow(frame);
      frame.setVisible(true);
    } catch (Exception ex) {
      device.setFullScreenWindow(null);
      System.exit(0);
    }
  }
  public static void main(String[] args) {
    new FullScreen1();
  }
}

반응형
원어데이 (One a day)
http://www.oneaday.co.kr

인터넷 최저가로 하루에 한개의 상품만을 판매한다는 원어데이...

아이디어가 기발한 사이트이다.. 왠지 매력이 있지만....

이곳에 가게되면 지름신의 강림이.. ㅠㅠ  현명한 선택이 필요한 사이트

므튼 인터넷 최저가로 판매한다니... 가볼만 하다..
반응형

Jakarta Ant


-. 이번 강좌에서는 지난 시간에 이어 ant 사용에 필수적인 task들에 대해 알아보고

   예제를 통해 한번더 알아보도록 하겠습니다.

   만약 지난 강좌를 아직 보지 않았다면 다음 링크를 참조하세요

   http://www.jakartaproject.com/article/jakarta/1114617006525



I. 집합 태그


1. <fileset>

개요

-. fileset이란 말 그대로 파일의 집합을 말하며 특정 태스크에서 파일을 포함하여야 할때

손쉽게 특정 파일이나 집합을 지정해 주는데 사용된다

주로 클래스패스나, 압축, 파일 카피등의 task에서 사용되어진다


예제

사용예제-1


<fileset dir="${server.src}" casesensitive="yes">
  <include name="**/*.java"/>
  <exclude name="**/*Test*"/>
</fileset>
<fileset dir="${server.src}" casesensitive="yes">
  <filename name="**/*.java"/>
  <filename name="**/*Test*" negate="true"/>
</fileset>
<fileset dir="${server.src}" casesensitive="yes"> <filename name="**/*.java"/> <not> <filename name="**/*Test*"/> </not> </fileset>

모든 디렉토리의 java파일을 포함시키면서 파일이름중 Test가 들어가는 파일은 제외하는 fileset을 나타낸다

위 세가지 fileset은 같은 의미이다


사용예제-2


<fileset dir="${server.src}" casesensitive="yes">
  <include name="**/*.java, **/*.properties"/>
</fileset>
<fileset dir="${server.src}" casesensitive="yes">
  <include name="**/*.java"/>
<include name="**/*.properties"/>
</fileset>

","를 사용하여 나타낼 수도 있고 다로 분리하여 tag를 사용할 수도 있다

위 두 fileset은 같은 의미이다


속성

속성 설명 필수여부
dir 파일집합의 최상위 디렉토리 (루트 디렉토리) dir나 file둘중 하나는 필수
file 특정 하나의 파일을 지정할때 사용
defaultexcludes default excludes 에 명시된 파일 및 디렉토리를 자동적으로 제외하는 속성이며 이기능을 사용하려면 생략한다. 혹은 yes/no 로 값을 준다 No
includes 컴마나 스페이스로 구분된 파일의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 No
includesfile 특정 각각의 파일을 포함할때 사용하는 속성 No
excludes 컴마나 스페이스로 구분된 파일의 패턴을 제외하는 속성이며 생략하면 default excludes를 제외하고 어떠한 파일도 제외하지 않는다 No
excludesfile 특정 각각의 파일을 제외할때 사용하는 속성 No
casesensitive 패턴의 대소문자를 구분할지 여부를 나타내는 속성으로 기본값은 true이다 No
followsymlinks symbolic links를 허용할지 여부를 나타내며 기본값은 true이다 No


default excludes

excludes를 사용하지 않아도 기본적으로 제외되는 파일 및 디렉토리

     **/*~
     **/#*#
     **/.#*
     **/%*%
     **/._*
     **/CVS
     **/CVS/**
     **/.cvsignore
     **/SCCS
     **/SCCS/**
     **/vssver.scc
     **/.svn
     **/.svn/**
     **/.DS_Store

자 이정도면 fileset은 이제 빠~삭해 지셨겠죠?



2. <dirset>

개요

-. fileset이 파일 집합을 나타냈다면 dirset task는 디렉토리의 집합을 나타낸다. 기본적인 속성은 fileset과 동일하다

차이점은 defaultexcludes가 없다


사용예제


<dirset dir="${build.dir}"> <include name="apps/**/classes"/> <exclude name="apps/**/*Test*"/> </dirset>

apps 이하 디렉토리중 classes 디렉토리를 포함하고 apps 이하 디렉토리중 디렉토리 이름중 Test가 들어가는 디렉토리는 제외한 dirset을 의미한다


속성

속성 설명 필수여부
dir 파일집합의 최상위 디렉토리 (루트 디렉토리) YES
includes 컴마나 스페이스로 구분된 디렉토리의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 No
includesfile 특정 각각의 디렉토리를 포함할때 사용하는 속성 No
excludes 컴마나 스페이스로 구분된 디렉토리의 패턴을 제외하는 속성이며 생략하면 어떠한 디렉토리도 제외하지 않는다 No
excludesfile 특정 각각의 디렉토리를 제외할때 사용하는 속성 No
casesensitive 패턴의 대소문자를 구분할지 여부를 나타내는 속성으로 기본값은 true이다 No
followsymlinks symbolic links를 허용할지 여부를 나타내며 기본값은 true이다 No



3. <patternset>

개요

-. 여러 파일이나 디렉토리를 미리 그룹핑해 놓고 이를 특정 아이디를 통해 사용하는 방식을 제공한다. 즉 워드의 매크로 같은 기능이라 보면 쉽게 이해가 갑니다


사용예제

<patternset id="non.test.sources">
  <include name="**/*.java"/>
  <exclude name="**/*Test*"/>
</patternset>
...
<fileset dir="${server.src}">
<patternset refid="non.test.sources"/>
</fileset>
...
<fileset dir="${server.src}">
<patternset refid="non.test.sources">
<include name="**/*.java"/>
</patternset>
</fileset>

예제를 보는바와 같이 patternset은 여러곳에서 동일한 패턴을 사용할때 이를 미리 정의해 놓고 지정한 id의 값을 refid를 통해 재사용 할 수 있다

paternset을 사용하면 코딩양을 줄일 수 있고 변동사항이 있으면 손쉽게 변동 할 수 있다는 점이다


속성

속성 설명 필수여부
includes 컴마나 스페이스로 구분된 디렉토리의 패턴을 포함하는 속성이며 모든 파일을 사용하려면 생략한다 No
includesfile 특정 각각의 디렉토리를 포함할때 사용하는 속성 No
excludes 컴마나 스페이스로 구분된 디렉토리의 패턴을 제외하는 속성이며 생략하면 어떠한 디렉토리도 제외하지 않는다 No
excludesfile 특정 각각의 디렉토리를 제외할때 사용하는 속성 No



4. <path>

개요

-. 파일과 디렉토리를 함께 나타낼 수 있는 집합. 클래스패스에는 경로뿐만 아니라 *.jar 같은 파일이 같이 사용되듯이 이 path task는 주로 클래스패스로 자주 이용된다

fileset, dirset과 비슷하지만 파일과 디렉토리를 함께 나타낼 수 있다는 점에서 틀리다

path tag역시 patternset과 같이 지정된 id 값을 이용하여 여러 곳에서 재사용 할 수 있다.


사용예제

아래 예제는 ${basedir}/lib/struts.jar, ${base.dir}/lib/log4j.jar 그리고 ${base.dir}/classes 에 클래스패스를 잡는 예제이다.

<path id="base.path">
<pathelement path="lib/struts.jar;lib/log4j.jar"/> <pathelement location="classes"/> </path> ...
<classpath refid="base.path"/>
...

path에 대한 정의를 해놓고 base.path라는 아이디를 이용하여 여러 곳에서 사용할 수 있다


location 속성은 single 파일이나 탐색할 하나의 디렉토리만을 설정할수 있는 반면에,

path는 ";"나 ":"를 사용하여 여러 파일들이나 디렉토리를 설정할 수 있다


II. 파일 태그


1. <copy>

개요

-. 소스 파일을 타겟으로 파일을 복사하는데 사용한다


사용예제

파일 하나 복사

<copy file="myfile.txt" tofile="mycopy.txt"/>


파일 하나를 디렉토리에 복사

<copy file="myfile.txt" todir="../some/other/dir"/>

 

디렉토리를 다른 디렉토리로 복사 

<copy todir="../new/dir">
    <fileset dir="src_dir"/>
</copy>

 

파일 집합을 디렉토리에 복사

<copy todir="../dest/dir">
    <fileset dir="src_dir">
      <exclude name="**/*.java"/>
    </fileset>
</copy>

<copy todir="../dest/dir">
    <fileset dir="src_dir" excludes="**/*.java"/>
</copy>

 

파일 집합을 디렉토리에 복사하며 파일명 끝에 .bak을 추가하여 복사

<copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <globmapper from="*" to="*.bak"/>
</copy>

 

파일집합을 디렉토리에 복사하며 파일집합중 TITLE 이란 STRING을 Foo Bar로 대체하며 복사

<copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <filterset>
      <filter token="TITLE" value="Foo Bar"/>
    </filterset>
</copy>


속성

속성 설명 필수여부
file 복사할 파일 fileset tag를 사용하지 않는다면 필수
preservelastmodified

소스와 타겟의 최종 수정날짜 파일을 유지하며 복사한다

기본값은 false

No
tofile 복사할 소스파일 fileset tag와 함께 소스 및 타겟을 지정할수있다
todir 복사할 소스 디렉토리
overwrite 타겟의 파일이 최근의 파일이라도 덮어쓸지 여부를 나타내며 기본값은 false No
filtering

복사하는동안 filter를 사용할것인지 여부를 나타내며 기본값은 false

단 이 값이 false일지라도 nested 하게 <filterset>을 사용할수 있다

No
flatten

소스 디렉토리의 구조를 무시하고 특정 디렉토리 한곳에 모든 파일을 복사할지 여부를 나타내며 기본값은 false

No
includeEmptyDirs

<fileset>을 지정하여 복사될 디렉토리중에 파일이 없는 비어있는 디렉토리까지 복사할지 여부를 나타내며 기본값을 true

No
failonerror

복사중 에러가 발생할때 false이면 warning 메세지 로그를, 그렇지 않으면 build시 중지한다

기본값은 true

No
verbose 복사되고 있는 파일의 로그 여부를 나타내며 기본값은 false No
encoding

필터 복사중 사용할 encoding을 나타내며 기본값은 JVM 기본 encoding을 따른다 (ant 1.5 이후)

No
outputencoding

파일기록에 사용할 encoding을 나타낸다

(ant 1.6이후)

No
enablemultiplemappings

true면 주어진 소스 path에대해 모든 mapping 처리를 하며 false이면 첫번째 파일이나 디렉토리에 대해서만 mapping 처리를 한다

이 속성은 <mapper> subelement가 있을때만 관련있다

기본값은 false

(ant 1.6이후)

No
granularity

최근 수정된 시간을 기준으로 파일을 비교 복사시 기준이 되는 시간으로부터 여유분 시간을 나타낸다

즉 소스 파일 서버와 타겟 파일 서버가 다른경우 두 머신간에 시간차이가 있을 수 있기 때문에 이를 사용한다

(ant 1.6.2 이후)

 


2. <delete>

개요

-. 하나의 파일, 하나의 디렉토리 혹은 fileset으로 지정한 특정한 파일들을 삭제할수 있다


사용예제

하나의 파일을 삭제
<delete file="/lib/ant.jar"/>


하나의 디렉토리를 삭제 (이하 디렉토리 및 파일 모두 삭제됨)
<delete dir="lib"/>


현재 디렉토리로 부터 모든 파일중 .bak 파일은 모두 삭제
<delete>
    <fileset dir="." includes="**/*.bak"/>
</delete>


하나의 디렉토리를 삭제하며 빈 디렉토리라도 모두 삭제 (build 자신의 디렉토리도 삭제)
<delete includeEmptyDirs="true">
    <fileset dir="build"/>
</delete>


build 이하 모든 파일을 삭제하며 빈 디렉토리라도 모두 삭제 (build 자신의 디렉토리는 삭제되지 않음)
<delete includeemptydirs="true">
    <fileset dir="build" includes="**/*"/>
</delete>


 


속성

속성 설명 필수사항
file

삭제할 파일

(상대경로나 절대경로나 상관없음)

<fileset>을 사용하지 않는다면 file혹은 dir둘중 하나는 사용하여야 한다
dir

삭제할 디렉토리

verbose

각 삭제되는 파일의 이름을 보져줄 것인지 여부를 나타내며 기본값은 false

No
quiet

시스템이 사용하고 있어 삭제할수 없는 파일이거나

존재하지 않는 파일, 디렉토리등의 메세지를 나태낼지 여부를 나타내며 기본값은 false

No
failonerror

파일 삭제시 에러가 발생하면 build를 중단 하고 현재 사항을 레포팅해줄지 여부를 나타내며 기본값은 true

No
includeemptydirs fileset을 사용할 때 빈 디렉토리empty directory)를 삭제할 것인지 여부를 나타내며 기본값은 false No
includes Deprecated. Use <fileset>. No
includesfile Deprecated. Use <fileset>. No
excludes Deprecated. Use <fileset>. No
excludesfile Deprecated. Use <fileset>. No
defaultexcludes

Deprecated. Use <fileset>.

기본값은 true

No
deleteonexit

파일 삭제시 실패했을때 JVM이 종료될 때 이 파일을 지우도록 할것인지 여부를 나타내며 기본값은 false

(ant 1.6.2 이후)

No


3. <mkdir>

설명

-. 디렉토리를 생성


사용예제

"${dist}" 디렉토리를 생성한다

<mkdir dir="${dist}"/>


"${dist}/lib" 디렉토리를 생성한다

<mkdir dir="${dist}/lib"/>


속성

속성 설명 필수여부
dir 생성할 디렉토리 Yes


4. <move>

설명

-. 파일 혹은 디렉토리를 타겟으로 이동시킵니다 디폴트로 타겟에 이미 파일이 존재하면 덮어씁니다.


사용예제

하나의 파일을 이동시킵니다 (rename과 동일)
<move file="file.orig" tofile="file.moved"/>


하나의 파일을 디렉토리로 이동시킵니다
<move file="file.orig" todir="dir/to/move/to"/>


디렉토리를 새로운 디렉토리로 이동시킵니다
<move todir="new/dir/to/move/to">
    <fileset dir="src/dir"/>
</move>


위의 task와 동일하며 ant 1.6.3부터 지원합니다
<move file="src/dir" tofile="new/dir/to/move/to"/>


파일집합을 새로운 디렉토리로 이동시킵니다
<move todir="some/new/dir">
    <fileset dir="my/src/dir">
      <include name="**/*.jar"/>
      <exclude name="**/ant.jar"/>
    </fileset>
</move>


.bak을 제외한 모든 파일에 .bak을 추가시키며 이동시킵니다
<move todir="my/src/dir" includeemptydirs="false">
    <fileset dir="my/src/dir">
      <exclude name="**/*.bak"/>
    </fileset>
    <mapper type="glob" from="*" to="*.bak"/>
</move>



속성

-. delete 속성과 동일합니다



III. java 태그


1. <javac>

설명

-. 자바소스를 컴파일 하는 tag입니다

기본적으로 타겟에 특정 .java에 대해 .class 파일이 없거나 오래된 .class 파일이면 컴파일 대상입니다


사용예제

<path id="compile.classpath">

    <pathelement location="${catalina.home}/common/classes"/>
    <fileset dir="${web.home}/WEB-INF/lib">
      <include name="*.jar"/>
    </fileset>
</path>


가장 일반직인 컴파일 태그 compile.classpath 는 앞의 path 태그에서 정의됨

<javac srcdir="${src}"

          destdir="${build}">

     <classpath refid="compile.classpath"/>

</javac>


include, exclude, debug등을 포함한 컴파일 태그

<javac srcdir="${src}"
          destdir="${build}"
          includes="mypackage/p1/**,mypackage/p2/**"
          excludes="mypackage/p1/testpackage/**"
          classpath="xyz.jar"
          debug="on"
/>


srcdir 대신 <scr> 태그를 이용한 컴파일 태그

<javac destdir="${build}"
         classpath="xyz.jar"
         debug="on">
    <src path="${src}"/>
    <src path="${src2}"/>
    <include name="mypackage/p1/**"/>
    <include name="mypackage/p2/**"/>
    <exclude name="mypackage/p1/testpackage/**"/>
</javac>



속성

width=20%>속성 설명 필수여부
srcdir 자바 소스가 위치한 디렉토리

Yes

<src>가 존재하면NO

destdir 컴파일된 클래스파일이 위치할 디렉토리 No
includes 컴마나 스페이스로 구분된 파일집합의 패턴을 포함하여 컴파일하며 모든 파일을 사용하려면 생략한다 No
includesfile 각각 개개의 파일을 포함하여 컴파일 No
excludes 컴마나 스페이스로 구분된 파일의 패턴을 제외하하여 컴파일하며 생략하면 어떠한 디렉토리도 제외하지 않는다 No
excludesfile 각각 개개의 파일을 제외하여 컴파일 No
classpath 사용할 클래스 패스 No
sourcepath

사용할 소스패스이며 기본값은 srcdir 값이다

No
bootclasspath bootstrap 클래스 패스 No
classpathref 참조를 통해 사용할 클래스 패스 (refid를 이용한 path 태그) No
sourcepathref 참조를 통해 사용할 소스 패스 No
bootclasspathref 참조를 통해 사용할 bootstrap 패스 No
extdirs 사용할 extednsion이 위치한 경로 (${java_home}/lib/ext/를 말하는것 같음) No
encoding 소스파일에 사용할 encoding (javac의 -encoding과 동일) No
nowarn

컴파일시 -nowarn 옵션을 을 줄지 여부를 나타내며 기본값은 off

반대값은 on

No
debug 컴파일시 debug 모드로 컴파일 하며 기본값은 off No
optimize 컴파일시 optimize 옵션을 사용한다 기본값은 off No
deprecation 컴파일시 deprecation 옵션을 사용한다 기본값은 off No
target 특정 VM 버젼으로 컴파일 할수 있도록 한다 No
verbose

컴파일시 그 내용을 화면에 출력한다

기본값은 no

No
depend

이를 지원하는 컴파일러는 dependecy-tracking를 가능하게 한다

No
includeAntRuntime

ant run time library를 포함하여 컴파일하며 기본값은 yes

No
includeJavaRuntime

VM이 실행될때의 run time library를 포함하여 컴파일하며 기본값은 no

No
fork 외부의 JDK를 사용하여 컴파일 하며 기본값은 no No
executable

fork를 yes로 하였을경우 javac가 실행될 경로를 나타내며 기본값으로는 ant에서 현재 사용중인 java version의 컴파일러를 나타낸다

No
memoryInitialSize

VM내에서 초기 메모리 사이즈를 설정하며 기본값은 VM에 설정된 기본값을 사용한다

No
memoryMaximumSize VM내에서 최대 메모리 사이즈를 설정 No
failonerror

컴파일시 에러가 발생하였을 경우 계속 진행할지 여부를 나타내며 기본값은 true

No
source -source 옵션을 이용하여 컴파일 한다 No
compiler

사용할 컴파일러 설정 list

No
listfiles

컴파일 되는 소스파일들을 list할지 여부를 나타내며 기본값은 no

No
tempdir

ant가 사용하는 임시디렉토리

기본값은 java.io.tmpdir

(ant 1.6이후)

No


2. <javadoc>

개요

-. 자바 소스 파일로 부터 javadoc API 문서를 생성한다


사용예제

간단한 사용예

<javadoc sourcepath="${src.home}"
               destdir="${dist.home}/docs/api"
               packagenames="*">
       <classpath refid="compile.classpath"/>
</javadoc>


아래 3가지 사용예는 동일한 의미이다

<javadoc

           packagenames="com.dummy.test.*"
           sourcepath="src"
           excludepackagenames="com.dummy.test.doc-files.*"
           defaultexcludes="yes"
           destdir="docs/api"
           author="true"
           version="true"
           use="true"
           windowtitle="Test API">
    <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
    <bottom><![CDATA[<i>Copyright &#169; 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom>
    <tag name="todo" scope="all" description="To do:"/>
    <group title="Group 1 Packages" packages="com.dummy.test.a*"/>
    <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/>
    <link offline="true" href="http://java.sun.com/products/jdk/1.2/docs/api/" packagelistLoc="C:\tmp"/>
    <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
</javadoc>


<javadoc
           destdir="docs/api"
           author="true"
           version="true"
           use="true"
           windowtitle="Test API">

    <packageset dir="src" defaultexcludes="yes">
      <include name="com/dummy/test/**"/>
      <exclude name="com/dummy/test/doc-files/**"/>
    </packageset>

    <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
    <bottom><![CDATA[<i>Copyright &#169; 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom>
    <tag name="todo" scope="all" description="To do:"/>
    <group title="Group 1 Packages" packages="com.dummy.test.a*"/>
    <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/>
    <link offline="true" href="http://java.sun.com/products/jdk/1.2/docs/api/" packagelistLoc="C:\tmp"/>
    <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
</javadoc>


<javadoc
           destdir="docs/api"
           author="true"
           version="true"
           use="true"
           windowtitle="Test API">

    <fileset dir="src" defaultexcludes="yes">
      <include name="com/dummy/test/**"/>
      <exclude name="com/dummy/test/doc-files/**"/>
    </fileset>

    <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
    <bottom><![CDATA[<i>Copyright &#169; 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom>
    <tag name="todo" scope="all" description="To do:"/>
    <group title="Group 1 Packages" packages="com.dummy.test.a*"/>
    <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/>
    <link offline="true" href="http://java.sun.com/products/jdk/1.2/docs/api/" packagelistLoc="C:\tmp"/>
    <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
</javadoc>


속성

속성 설명 사용범위 필수여부
sourcepath 자바 소스 위치 all At least one of the three or nested <sourcepath>, <fileset> or <packageset>
sourcepathref 참조된 경로 아이디를 사용하여 소스위치를 지정 (path 의 refid를 사용) all
sourcefiles 컴마로 구분하여 소스 파일을 지정 all
destdir 결과물(java docs) 디렉토리를 지정 all Yes, unless a doclet has been specified.
maxmemory

javadoc VM에 할당할 최대 메모리 사이즈

all No
packagenames

컴마로 구분된 패키지 파일 목록

("*"로 끝나면 하위 패키지까지 모두 javadoc으로 처리한다)

all No
packageList 처리할 패키지를 포함하고있는 파일명 all No
classpath 사용할 클래스 패스 all No
Bootclasspath

사용할 bootstrap 클래스 패스

all No
classpathref 참조된 경로 아이디를 사용하여 클래스 패스를 지정 (path 의 refid) all No
bootclasspathref 참조된 경로 아이디를 사용하여  bootstrap classpath를 지정 all No
Extdirs 설치된 extension 위치 all No
Overview

HTML 문서로부터 overview 문서를 읽어온다

all No
access

Access mode를 지정한다

public, protected, package, private 중 하나의 값을 가지며 기본값은 protected이다

all No
Public 생성된 문서에 public 클래스와 멤버만 보여준다 all No
Protected 생성된 문서에 protected/public 클래스와 멤버만 보여준다 all No
Package 생성된 문서에 package/protected/public 클래스와 멤버만 보여준다 all No
Private 생성된 문서에 모든 클래스와 멤버를 보여준다 all No
Old jdk 1.1 버젼으로 문서를 생성한다 1.2 No
Verbose javadoc을 생성하는동안 메세지를 화면에 출력한다 all No
Locale

사용할 Locale 을 지정한다

(en_US, en_US_WIN, ko_KR)

all No
Encoding 소스파일 encoding 이름 all No
Version @version 단락을 포함한다 all No
Use 클래스와 패키지 사용법에 대한 페이지를 생성한다 all No
Author @author 단락을 포함한다 all No
Splitindex Split index into one file per letter all No
Windowtitle 생성된 문서의 브라우져 타이트을 지정한다 (텍스트) all No
Doctitle

패키지 인덱스 페이지에 대한 타이틀을 지정한다 (html 코드)

all No
Header

각페이지에대한 헤더부분을 지정한다 (html 코드)

all No
Footer 각페이지에대한 푸터부분을 지정한다 (html 코드) all No
bottom 각페이지에대한 버텀부분을 지정한다 (html 코드) all No
link

주어진 URL로 javadoc 출력물에 link를 생성한다

all No
linkoffline Link to docs at <url> using package list at <url2> - separate the URLs by using a space character -- see also the nested link element. all No
group 특정 패키지들에 대한 overview 페이지를 생성한다 all No
nodeprecated @deprecated 정보를 포함하지 않는다 all No
nodeprecatedlist deprecated 목록을 생성하지 않는다 all No
notree 클래스 하이라키를 생성하지 않는다 all No
noindex 인덱스를 생성하지 않는다 all No
nohelp 도움말 link를 생성하지 않는다 all No
nonavbar 네비게이션 바를 생성하지 않는다 all No
serialwarn @serial tag 대한 warning을 생성한다 all No
helpfile help 파일로 사용될 HTML 파일을 지정한다 all No
stylesheetfile CSS 로 사용할 파일을 지정한다 all No
charset 문서를 생성할때 사용될 charset을 지정한다 all No
docencoding 결과 파일(문서)에 사용될 encoding을 지정한다 all No
doclet

doclet을 시작하는 클래스 파일을 지정한다

all No
docletpath

doclet 클래스 패스를 지정한다

all No
docletpathref 참조 아이디값을 이용해 docletpath를 지정한다 all No
additionalparam

javadoc 명령에서 추가적인 파라미터를 추가하도록 한다

all No
failonerror

에러 발생시 build 중단할지 여부를 나타낸다

all No
excludepackagenames 문서를 생성하지 않을 패키지를 컴마로 구분하여 지정한다ment. all No
defaultexcludes

기본적으로 제외되는 목록을 사용할 것인지 여부를 나타낸다

all No
useexternalfile

명령줄을 간단히하기위해 임시파일에 기록된 소스파일명을 지정한다

기본값은 No

all No
source

j2se 1.4 소스코드에 나타난 주장을 처리하도록 javadoc에서 설정한다

1.4+ No
linksource

소스파일에 hyperlinks 생성한다

기본값은 No

(ant 1.6이후)

1.4+ No
breakiterator

새로운 breakiterator 알고리즘을 사용한다 기본값은 No

(ant 1.6이후)

1.4+ No
noqualifier

-noqualifier 옵션을 설정한다

(ant 1.6이후)

1.4+ No
includenosourcepackages

"true"이면 자바소스가 아닌 패키지된 html을 가지고 문서 생성이 한다

(ant 1.6.3이후)

all No (default is false)
executable

실행될 javadoc 위치를 지정한다

(ant 1.6이후)

all No


3. <war>

개요

-. 웹 어플리케이션 배포 파일인 war 파일을 생성해 준다


사용예제


thirdparty/libs/jdbc1.jar
thirdparty/libs/jdbc2.jar
build/main/com/myco/myapp/Servlet.class
src/metadata/myapp.xml
src/html/myapp/index.html
src/jsp/myapp/front.jsp
src/graphics/images/gifs/small/logo.gif
src/graphics/images/gifs/large/logo.gif


위의 파일을 WAR로 구성해 보자


<war destfile="myapp.war" webxml="src/metadata/myapp.xml">
  <fileset dir="src/html/myapp"/>
  <fileset dir="src/jsp/myapp"/>
  <lib dir="thirdparty/libs">
    <exclude name="jdbc1.jar"/>
  </lib>
  <classes dir="build/main"/>
  <zipfileset dir="src/graphics/images/gifs"
              prefix="images"/>
</war>


WAR task 후 다음과 같이 구성된다


WEB-INF/web.xml
WEB-INF/lib/jdbc2.jar
WEB-INF/classes/com/myco/myapp/Servlet.class
META-INF/MANIFEST.MF
index.html
front.jsp
images/small/logo.gif
images/large/logo.gif



속성

속성 설명 필수여부
destfile 생성될 WAR 파일 지정 둘중 하나는 필수
warfile Deprecated
webxml 사용할 deployment descriptor (WEB-INF/web.xml)를 지정 Yes
basedir jar파일로 압축할 디렉토리를 지정한다 No
compress

data를 압축할지 여부를 나타내며 기본값은  true이다

keepcompression 속성을 false로 했을지라도 이는 적용된다

No
keepcompression

이미 존재하는 파일 묶음에 대해 compress을 계속 유지할 것인지 여부를 나타내며 기본값은 fale 이다

(ant 1.6이후)

No
encoding

압축될 파일명에 사용할 encoding을 지정한다

기본값은 UTF8

No
filesonly

Store only file entries

기본값은 false

No
includes 지정된 컴마나 스페이스로 구분된 파일 패턴을 WAR에 포함하며 생략하면 모든 파일을 WAR한다 No
includesfile 지정된 개개의 파일을 WAR에 포함한다 No
excludes 지정된 컴마나 스페이스로 구분된 파일 패턴을 WAR에서 제외시키며 생략하면 어떠한 파일로 제외하지 않는다 No
excludesfile 지정된 개개의 파일을 WAR에서 제외시킨다 No
defaultexcludes 기본적으로 제외시키는 기능을 사용할것인지 여부를 나타낸다 No
manifest 사용할 manifest 파일을 지정한다 No
update 이미 존재하는 파일이라면 업데이트할지 덮어쓸지를 결정하며 기본값은 false이다 No
duplicate

중복된 파일이 나타났을 때 "add"할지 "preserve"할지 혹은 "fail"할지를 지정하며 기본값은 "add"이다

No
roundup

파일 시간 비교시 파일 변경 시간을 다음 짝수 횟수의 초(seconds)에 반올림 할지 혹은 내림할지 여부를 나타낸다

기본값은 true
(ant 1.6.2 이후)

No


from http://ant.apache.org/manual/index.html


=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

+ Recent posts