레이블이 java polymorphism인 게시물을 표시합니다. 모든 게시물 표시
레이블이 java polymorphism인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 8일 목요일

java.awt.Container(Abstract) , ORACLEJAVA 프로그래밍

java.awt.Container(Abstract) 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


java.lang.Object --> java.awt.Component --> java.awt.Container

자신의 영역안에 다른 Component를 포함할수 있는 Component

Container도 Component Class의 하위Class 이므로 그 자체도 Component로 취급되며 다른 Container에 부착될 수 있습니다.

일반적으로 GUI를 만들때는 Component를 Container에 배치하고, 그런 작은 Container를 더 큰 Container에 포함시켜서 GUI를 구성 합니다.

Frame과 Applet은 대표적인 최상위 Container이다. 최상위 Container란 다른 Container를 포함하여 맨 바깥쪽 Container로 사용되는 컨테이너를 지칭 합니다. 이에 비해 Panel은 다른 Container에 부착되어 일부 영역을 Control하는 경우에 사용 됩니다. Window는 많이 사용되지 않으며 하위 Class인 Frame이 많이 사용 됩니다.

Dialog와 FileDialog Container는 대화창에서 주로 사용 됩니다.

컴포넌트를 컨테이너에 추가할 때 색인이 지정되지 않을 경우, 목록 끝(즉, 스택 순서 아래)에 추가 됩니다.

Panel, ScollPane, Window의 상위 클래스


Window클래스나 Window 클래스의 파생클래스(Frame등)는 포함 할 수 없습니다.



Container – component 추가/제거/추출 메소드

add(Component) : 지정된 컴포넌트를 컨테이너의 끝에 추가 합니다.

add(Component, int) : 해당 위치에 있는 컨테이너에 지정된 컴포넌트를 추가 합니다.

add(Component, Object) : 지정된 컴포넌트를 컨테이너의 끝에 추가 합니다.

add(Component, Object, int) : 지정된 색인에서 지정된 제약 조건이 있는 컨테이너에 지정된 컴포넌트를 추가 합니다.

add(String, Component) : 컨테이너에 지정된 컴포넌트를 추가 합니다.

remove(Component) : 컨테이너에서 지정된 컴포넌트를 제거 합니다.

remove(int) : 컨테이너에서 index에 의해 지정된 컴포넌트를 제거 합니다.

remove() : 컨테이너에서 모든 컴포넌트를 제거합니다.

getcomponent(int) : 컨테이너에 있는 n번째 컴포넌트를 가져 옵니다.

getcomponentAt(int, int) : x,y 위치가 포함된 컴포넌트 위치를 찾습니다.

getcomponentAt(Point) : 지정된 지점이 포함된 컴포넌트를 가져 옵니다.

getcomponentCount() : 패널에 있는 컴포넌트의 수를 가져 옵니다.

getComponents() : 컴포넌트에 있는 모든 컴포넌트를 가져 옵니다.

isAncestorOf(Component) : 컨테이너의 컴포넌트 계층구조에 컴포넌트가 포함되어 있는지 확인 합니다.



Container – 그래픽/이벤트와 관련된 메소드

update(Graphics) : 컨테이너를 갱신 합니다.

paint(Graphics) : 컨테이너의 색상을 표시 합니다.

paintComponents(Graphics) : 컨테이너에 있는 각 컴포넌트의 색상을 표시 합니다.

print(Graphics) : 컨테이너를 인쇄합니다.

printComponents(Graphics) : 컨테이너의 각 컴포넌트를 인쇄 합니다.

addContainerListener(ContainerListener) : 컨테이너로부터 컨테이너 이벤트를 수신하기 위해 지정된 컨테이너 수신기(listener)를 추가 합니다.

processContainerEvent(ContainerEvent) : 등록된 ContainerListener 객체로 보내어 컨테이너에서 발생하는 컨테이너 이벤트를 처리 합니다.

processEvent(AWTEvent) : 컨테이너의 이벤트를 처리 합니다.

doLayout() : 컨테이너가 컴포넌트를 배치하도록 합니다.

getLayout() : 컨테이너의 배치 관리 프로그램을 가져 옵니다.

setLayout(LayoutManager) :컨테이너에 대한 배치 관리 프로그램을 설정 합니다.

validate() : 컨테이너와 모든 부속 컴포넌트를 확인합니다. 컨테이너와 하부 컴포넌트를 다시 배치 합니다.

invalidate() : 컨테이너와 모든 부속 컴포넌트가 다시 그려져야 한다고 표시 합니다.



Container – 기타 메소드

addNotify() : 컨테이너가 피어(peer)를 작성하도록 통지 합니다.

getAlignmentX() : x축을 따라 정렬 합니다.

getAlignmentY() : y축을 따라 정렬 합니다.

getInsets() : 컨테이너의 경계 크기를 표시하는 컨테이너의 인세트(inset)를 결정 합니다.

getMaximumSize() : 컨테이너의 최대 크기를 리턴 합니다.

getMinimumSize() : 컨테이너의 최소 크기를 리턴 합니다.

getPreferredSize() : 컨테이너의 선호 크기를 리턴 합니다.

invalidate() : 컨테이너를 무효로 합니다.

list(PrintStream, int) : 지정된 출력 스트림에 컨테이너 목록을 인쇄 합니다.

list(PrintWriter, int) : 지정된 들여쓰기 위치에서 시작하여 지정된 인쇄 작성자로 목록을 인쇄 합니다.

removeNotify() : 컨테이너와 모든 부속 컴포넌트가 피어를 제거하도록 통지 합니다.





------------------------------

java.awt.Panel

--------------------------

다른 Component나 그하위 Component들이 표시될수 있는 장소를 제공하나 , 스스로 화면에 그릴수는 업습니다.

자기를 스스로 그릴수 있는 다른 Window나 그하위의 Frame, Dialog 와 같은 Component에 포함시켜서 사용해야 합니다.

Panel Class에서만 제공하는 주요한 메소드 특별히 없습니다. 결국 다른 Component를 포함할수 있다는 점을 제외하면 Canvas와 별차이가 없다고 할수 있습니다.

Applet Class가 Panel Class를 상속합니다.

Applet은 브라우저창에서 실행되므로 자신을 그릴수 있는 기능을 제공하지 않는 Panel을 상속한다고 볼 수 있습니다.



[예제]

/* 프레임에 Panel을 올리는 예제 */
import java.awt.*;
public class PanelTest extends Frame{
public PanelTest(String s) {
super(s);
}
public static void main(String[] args) {
PanelTest f = new PanelTest("Frame에 Pamel을 넣는예제");
Panel p = new Panel();
f.setSize(300,300);
f.setLayout(null);
p.setSize(150,150);
p.setBackground(Color.blue);
f.add(p);
f.setVisible(true);
}

[ORACLEJAVA커뮤니티]struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법

struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


1.        새로운 ActionServlet을 하나 만듭니다.

package yfarm;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import org.apache.struts.action.ActionServlet;
import java.io.IOException;

//struts-config.xml과 메시지 Resource 파일을 수정 했을 때 자동으로 인식할 수 있게...
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.RequestUtils;

public class NewActionServlet extends ActionServlet {
       
    protected void Process (HttpServletRequest request, HttpServletResponse response)
                                  throws IOException, ServletException {
        String uri = request.getRequestURI();
       
        if(uri.indexOf("reload.do") != -1) {
            init();
           
            RequestUtils.selectModule(request, getServletContext());
           
            ModuleConfig config = getModuleConfig(request);
           
            getRequestProcessor(config).init(this, config);
           
            RequestDispatcher dispatcher = request.getRequestDispatcher("/reload.jsp");
           
            dispatcher.forward(request, response);           
        }
        else {
            super.process(request, response);
        }
    }
}
                       
위의 NewActionServlet은 URL에 reload.do가 포함되어 있는 경우 초기화를 수행 하도록 합니다. 초기화는 두 단계로 진행하는데 첫째 ActionServlet의 init() 호출하여 struts-config.xml을 초기화 하며 둘째 RequestProcessor 클래스를 초기화 합니다. RequestProcessor 클래스가 초기화 되지 않으면 struts-config.xml이 수정되기 전에 사용된 Action 클래스들이 재사용 되므로 수정된 내용이 반영되지 않을 수도 있습니다.

2.        web.xml을 수정 합니다.
(사용자의 요청을 NewActionServlet이 수행하도록 수정 합니다.)

<servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>yfarm.NewActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>

3.        ReloadStrutsConfigAction 클래스를 만듭니다. ( 이 클래스가 reload action인 reload.do에 대해 대응을 하는데 아무 일도 하지 않습니다.)

/*
 * Created on 2005. 5. 6.
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package oraclejava;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 이종철
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

public class ReloadAction extends Action {
    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest  request,
        HttpServletResponse response) throws Exception {
        return null;     
    }
}

4.        struts-config.xml에 아래를 추가 합니다. (action-mappings에 추가)

<action
            path="/reload"
            type="oraclejava.ReloadAction"   
    />


5.        XML파일이나 메시지 리소스 등을 수정 후 URL에서 /reload.do를 불러주면 웹 서버를 재시작 하지 않더라도 수정 사항이 반영 됩니다.

2013년 8월 1일 목요일

(Java PolyMorphism)자바 다형성

주어진 유형의 변수 하나로 여러 유형의 객체를 참조하고 , 변수가 참조하는 객체 유형에 맞는 메소드를 자동으로 호출할 수 있는것
 즉 다형성을 이용하면 메소드 호출 하나가 호출이 적용되는 객체의 유형에 따라 서로 다르게 작동하도록 할 수 있다.
  다형성이 구현되기 위한 조건
    - 서브클래스의 객체의 메소드 호출은 수퍼클래스 유형의 변수를 통해서
        Book selectedBook;
  Random select = new Random();

for(int i=0;i<10;i++) {
selectedBook = theBooks[select.nextInt(theBooks.length)];
System.out.println("\n ***** 선택한 책 ***** \n" + selectedBook);
selectedBook.display();
}         
 호출된 메소드는 수퍼클래스의 메소드
 수퍼클래스와 서브클래스에서 메소드 유형및 리턴값이 같아야 한다.
 메소드 접근제한은 서브클래스가 수퍼클래스 보다 덜 제한적이어야 한다.

import java.util.Random;
class Book {
public Book(String aType) { type = new String(aType); }
public String toString() { return "이것은 " + type; }
public void display() { }
private String type;
}

class EngBook extends Book {
public EngBook(String aName) {
super("영어책...");
name = aName;
}
public void display() { System.out.println("이 책은 영어를 공부하는데 쓰입니다...");}
public String toString() { return "책 제목은 : " + name ; }
private String name;
}


class JavaBook extends Book {
public JavaBook(String aName) {
super("자바책...");
name = aName;
}
public void display() {
System.out.println("이 책은 자바언어를 공부하는데 쓰입니다...");
}
public String toString() {
return "책 제목은 : " + name ;
}
private String name;
}

public class MyPolymorphism {
public static void main(String[] args) {


Book[] theBooks = {
              new EngBook("English Alive..."),
              new JavaBook("자바정복하기..."),
new JavaBook("자바30일완성..."),
new EngBook("영어박살내기...")
};
Book selectedBook;
Random select = new Random();

for(int i=0;i<10;i++) {
selectedBook = theBooks[select.nextInt(theBooks.length)];
System.out.println("\n ***** 선택한 책 ***** \n" + selectedBook);
selectedBook.display();
}
        }
}