달력

52025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

1. org.jfree.chart.JFreeChart

JFreeChart의 기본 클래스이다. 자바2D로 구현되어 있으며 현재 바 차트 , 라인 차트 , 파이 차트 , XY 플롯(시간에 따른 XY그래프)를 지원한다. JFreeChart클래스는 제목을 나타내는 AbstractTitle객체 , Legend객체 , Plot객체 그리고 DataSet객체로 이루어져 있다.

2. org.jfree.chart.AbstractTitle

차트의 제목을 나타낸다. 하위 클래스로 ImageTitle , LegendTitle , TextTitle로 구성되어 있다.

3. org.jfree.chart.Legend

 차트에 포함된 시리즈(series)의 이름과 그 표현방식을 구성한다.

4. org.jfree.chart.plot.Plot

 JFreeChart클래스는 축과 데이터를 그리는(draw) 작업을 Plot에게 위임하였다. 대표적인 하위 클래스로는
CategoryPlot , PiePlot , XYPlot등이 있다.

5. org.jfree.data.DataSet

차트의 데이터를 담당한다. 대표적인 구현 클래스로는 DefaultPieDataSet , TimeSeriesCollection등이 있다.

6. org.jfree.chart.ChartFactory

차트를 생성을 위한 메소드를 제공한다. 예를 들어 pie차트를 만들기 위해서는 creatPieChart() 메소드를 사용한다.

7. org.jfree.chart.ChartPanel

차트를 생성한 후 JFreeChart 클래스를 ChartPanel에 넣어 스윙 컴포넌트로 사용할 수 있다


#1 첫번째 방법~

- JFreeChart 의 Font를 가져와 변경하는 방법!!
차트 제목과 범례 : JFreeChart 로 부터
각 축 : JFreeChart 의  CategoryPlot 로 부터 받아온다.
x축 : getDomainAxis()
y축  : getRangeAxis()  각 축의 정보를 가지고 있다.

  /* 한글 처리 문제 */
  //차트 제목
  labelFont = jfc.getTitle().getFont();
  jfc.getTitle().setFont(new Font("굴림",labelFont.getStyle(),labelFont.getSize()));
  //X축 제목
  labelFont = cgp.getDomainAxis().getLabelFont();
  cgp.getDomainAxis().setLabelFont(new Font("돋움",labelFont.getStyle(),labelFont.getSize()));

  //X축 값에 대한 레이블
  labelFont = cgp.getDomainAxis().getTickLabelFont();
  cgp.getDomainAxis().setTickLabelFont(new Font("돋움",labelFont.getStyle(),labelFont.getSize()));

  //Y축 제목
  labelFont = cgp.getDomainAxis().getLabelFont();
  cgp.getRangeAxis().setLabelFont(new Font("돋움",labelFont.getStyle(),labelFont.getSize()));

  //Y축  값에 대한 레이블
  labelFont = cgp.getRangeAxis().getTickLabelFont();
  cgp.getRangeAxis().setTickLabelFont(new Font("돋움",labelFont.getStyle(),labelFont.getSize()));

  //범례
  //jfc.getLegend().setItemFont(new Font("돋움",Font.PLAIN,10));


# 2 두번째 방법~

 

JRE에 한글 font가 설치 되어있지 않아서 발생하는 문제

JAVA_HOME/jre/lib 폴더에 보면 fontconfig 파일들이 존재한다.
이중 fontconfig.RedHat.properties.src 파일을 fontconfig.properties파일로 복사
fontconfig.properties파일에 쓰기 권한을 주고 편집

#> cp fontconfig.RedHat.properties.src fontconfig.properties
#> chmod +w fontconfig.properties
#> vi fontconfig.properties
--------------- font.config.properties 내용 --------------------------
# 생략
.
.
.
# AWT X11 font paths
awtfontpath.chinese-tw-iso10646=/usr/share/fonts/zh_TW/TrueType
awtfontpath.chinese-cn-iso10646=/usr/share/fonts/zh_CN/TrueType
awtfontpath.japanese-iso10646=/usr/share/fonts/ja/TrueType
awtfontpath.korean-iso10646=/usr/share/fonts/ko/TrueType      <---- 이부분을 폰트 파일의 위치로 수정

서버에서 /usr/local/java...(java폴더명은 서버마다 틀릴수 있다.)/jre/lib/ 폴더에 있는

 fontconfig.RedHat.properties.src 열고  가장 밑에 부분에 있는 곳을 확인해본다.
........

# AWT X11 font paths
awtfontpath.chinese-tw-iso10646=/usr/share/fonts/zh_TW/TrueType
awtfontpath.chinese-cn-iso10646=/usr/share/fonts/zh_CN/TrueType
awtfontpath.japanese-iso10646=/usr/share/fonts/ja/TrueType
awtfontpath.korean-iso10646=/usr/share/fonts/ko/TrueType

/usr/share/fonts/ko/TrueType 디렉토리를 생성하고 그 디렉토리에
batang.ttc과 gulim.ttc파일을 복사해 넣는다.

tomcat을 재구동 시켜준다.


 

Posted by 인천총각
|

실전 Applet 차트 만들기!!!
--------------------------------------------------------------------------------------------------------
Graphics

clearRect(시작점x,시작점y,폭,높이);사각형으로 지운다..

drawArc(시작점x,시작점y,폭,높이,시작각도,끝나는각도);호를 그린다

drawImage(이미지,이미지시작x,이미지시작y,이미지표시되는프레임(현재프레임-this),폭,높이);
                                                                                                   toolkit을 통해서 이미지 얻어올것!!

drawLine(시작점x,시작점y,끝x,끝y);일직선으로 선을 긋는다

drawPolygon(x배열,y축배열,int);다각형

drawPolyline();

drawRect(x,y,폭,높이);사각형

drawRoundRect(x,y,폭,높이,각도);둥근사각형

drawString(문자열,x,y);문자열을 그림으로

fillRect...() 속을 채운다!!(getColor,setColor,getFont)로 지정한다.

setXORMode(Color)겹쳐지는부분 색 지정

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

1. 차트에서의 pixel 비율로 변환하는 과정

AAA = 최대값-실제값 /(최대값-최소값)

최대값 : 200
최소값 : 100
실제값 : 150
ex) (200 - 150) / 100 = 0.5 (AAA값)

최대값 : 200
최소값 : 100
실제값 : 180
ex) (200 - 180) / 100 = 0.2

최대값 : 200
최소값 : 100
실제값 : 110
ex) (200 - 110) / 100 = 0.9

2. 차트에 그려질 Y축의 값 구하기


0
│                                                   <- 캔버스 윗단
│-----------------------------
│                                            ∧
│                                            │   <- 캔버스 사용 높이
│                                            │
│     o    o                               │
│   o                                       │
│       o                                   │
└──────────---------
300 (y축 pixel 비율)

Applet 높이 : 480
캔버스 사용 높이 : 320 (Applet 높이의 2/3만 실 차트로 사용)
캔버스 윗단 : 80

BBB(y축값)
BBB = (pixel로 변환된 값(AAA) * 캔버스 사용높이)+캔버스의 윗단(캔버스의 한토막= 캔버스 높이 / 6 )


ex) (0.5 * 320)+80 = 240 pixel(캔버스 표시 y축 좌표) 실제값 (150)
ex) (0.2 * 320)+80 = 144 pixel(캔버스 표시 y축 좌표) 실제값 (180)
ex) (0.9 * 320)+80 = 368 pixel(캔버스 표시 y축 좌표) 실제값 (110)


(for문 사용 i=0 부터...)

3. x,y 축 값을 이용하여 그래프 만들기


# 꺽은선 그래프

fillRect 사용 : g.fillRect(x축,y축,width,height);

ex) fillRect(x축(i x 30 + 20-1), y축(240), 3 ,3 );

1. i 값 증가시 x 30 을 x축 간격 조절
2. 기본 20-1 ((i==0)일때) 즉, 19간격에 위에서 구한 y축 좌표값 으로
3. 19,240 좌표에 높,넓이 3의 타원을 그린다.

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

각 좌표값 잇기!!! (i>0) 클때

drawLine 사용 : g.drawLine(start x축, start y축, end x축, end y축);

즉, g.drawLine(이전좌표 xy, 현좌표 xy)

ex) g.drawline((i-1) x 30 + 20 , 240, i x 30 +20, 144);
 
1. 이전좌표의 (i-1) x 30 +20 은 현 좌표에서 이전좌표의 x축 값을 구하기위함
2. i x 30 +20 은 현 좌표의 x축 을 구함

 
# 막대 그래프


1. 최소값 비교 후 ex) if (Integer.parseInt((String) applet.vtSent.elementAt(i)) == applet.naxismin)

2. 최소값 일 경우

 G.drawLine(i * 30 + 20 - 10, y축 , i * 30 + 20 - 1, y축); // 선하나만 그린다

3. 최소값이 아닐 경우(g.fillRect 사용)
 
 G.fillRect(i * 30 + 20 - 10, nSent, 9, -(nSent - (int) (getSize().height * 5 / 6)));

------->G.fillRect(x축 , y축 , width, height);

 -(y축 - (int) (getSize().height * 5 / 6)) -> y축 좌표값에서 Applet 높이의 5/6을 뺀다
 
ex)

y축 240

Applet 높이 480

-(240-(480*5/6)) ---> -(240 - 400) => -(-160) => 160

 

 

'Applet' 카테고리의 다른 글

JFreeChart (한글 깨짐 현상 해결)  (0) 2010.01.18
APPLET 이란???  (0) 2009.12.29
Posted by 인천총각
|

APPLET 이란???

Applet 2009. 12. 29. 13:07

APPLET 이란 ?

▷ Applet은 HTML 페이지에 내장되어 Web Browser의해 download되고 수행된다.
    Applet의 수행은 application의 수행과 분명히 구분된다.
    Application은 main()문 부터 수행이 되지만, applet은 수행의 시작을 비롯한 life cycle이 좀 더 복잡하다.

Applet Security Restrictions(애플릿의 보안)

▷ applet은 다른 곳에 떨어져 있는 사이트에서 load되어 local에서 실행되도록 설계되었기 때문에 보안이 중요하다.
   만약 내 컴퓨터에 중요한 정보가 있었다면 그것을 몰래 가져갈 수도 있을 것이다. 

▷ Web browser Security Manager는 applet이 접근 규칙을 위반할 경우 SecurityException이 발생한다.

▷ 대부분의 applet에 적용되는 보안은 browser 수준에서 이루어지는데, 아래와 같은 작업을 제한하고 있다.

  -Local system상의 다른 프로그램의 수행.
  -File I/O
  -Native method 호출
  -Applet이 다운로드된 host이외의 host에 대한 소켓(socket)연결

JDK1.2에서는 URL단위로 보안을 설정할 수 있고, 보안 정책을 따로 둘 수가 있다.

Writing an Applet
Applet은 다음과 같은 형식으로 class가 만들어진다.

예)     import java.applet.*;
        public class HelloWorld extends Applet {

Applet은 반드시 public class로 되어야 하며, file의 이름이 class의 이름과 같아야 한다.
(html 파일이름은 달라도 된다.)

Applet Class Hierarchy
Applet class는 Panel class의 subclass이다. 때문에 applet은 flowlayout을 기본 layout으로 한다.

java.lang.Object

|

+--java.awt.Component

|

+--java.awt.Container

|

+--java.awt.Panel

|

+--java.applet.Applet

주요 Applet Methods

public class Simple extends java.applet.Applet {

. . .

public void init()

{ . . . }/* 애플릿이 로드되거나 재로드될 때 처음으로 수행되는 코드 */

public void start()

{ . . . }/* 애플릿이 로드되거나 사용자가 재방문했을 때 수행되는 코드 */

public void stop()

{ . . . }/* 애플릿이 있는 페이지를 떠나거나 브라우저를 중지했을 때 수행되는 코드 */

public void destroy()

{ . . . }/* 로드를 취소하였을 때(cleanup) 수행되는 코드 */

}

▷ init() - 한번만 호출된다. 애플릿이 처음 생성되고 브라우저에 load될 때 호출되는 메소드이다. 이 메소드는 애플릿에 필요한 초기화를 제공한다. 이 메소드는 생성자와 비슷하게 동작하여 자바가 애플릿을 처음 로드할때에 자동적으로 시스템에 의해 호출된다. 보통 PARAM 값을 처리하고 사용자 인터페이스를 추가한다.

▷ start() - init() 이후에 애플릿이 동작하기 시작할 때 구동되는 메소드이다. init() 메소드가 호출된 후에 자동적으로 호출된다. 그리고 사용자가 다른 페이지로부터 이 애플릿을 포함한 페이지로다시 돌아올 때마다 호출된다. 이것은 start 메소드가 init 메소드와는 달리 반복적으로 호출된다는 것을 의미한다. 그러므로 단 한번만 실행되어야 할 코드는 init 메소드에 넣어야 한다.

▷ stop() - 애플릿이 동작을 멈출 때 구동된다. 다른 URL로 접속된 경우에 호출된다. 즉, 이 메소드는 사용자가 애플릿이 있는 현재의 페이지를 나오면 자동적으로 실행된다. 그러므로, 동일한 애플릿에 대해 반복적으로 호출된다. 그 목적은 사용자가 애플릿에 관심을 두지 않을 때 시스템 속도를 저하시키는 시간 소모적인 활동을 하지 않도록 하는 기회를 제공하는 것이다.

▷ destroy() - 브라우저가 정상적으로 종료될 때에 이 메소드를 호출하도록 되어 있다. 애플릿은 HTML 파일 내부에 있도록 되어 있으므로, 이 메소드는 브라우저가 종료될때에 자동적으로 일어난다. destroy 메소드에 집어넣어야 할 것은 사용자가 소비한 윈도우 핸들러와 같은 비 메모리 의존 자원을 회수하는 코드이다. 물론, 만일 애플릿이 여전히 활동하고 있다면, 자바는 destroy 메소드를 호출하기 전에 stop 메소드를 호출한다.

Applet Display

▷ Applet은 그래픽하게 나타난다. System.out.println()은 사용할 수 없다. 대신 paint() method를 사용하여 applet's panel에 원하는 것을 그릴 수 있다. paint() method는 browser에 의해서 applet의 display가 새로고쳐질 필요가 있을 때마다 호출되어야 한다.(repaint())

Applet Painting

▷ Applet에서 painting을 하기위해서 호출되어지는 method이다. 그리고, 아래와 같은 Cycle에서 의해서 applet이 보여진다.

▶ paint(Graphics g)

▶ repaint()

▶ update(Graphics g)

Applet Attribute

▷ Appelt attribute의 예

<applet

[archive=archiveList]

code = appletfile.class

width=pixels height=pixels

[codebase=codebaseURL]

[alt=alternateText]

[name=appletInstanceName]

[align=alignment]

[vspace=pixels]

[hspace=pixels] >

[<param name =appletAttribute1 value=value>]

[<param name =appletAttribute2 value=value>]

[alternateHTML]

</applet>

▷ 위치에 관련된 applet attribute

▶ width , height - 이 속성은 반드시 해야 하며, applet의 폭과 높이를 픽셀 단위로 준다. appletviewer의 경우, 이것은 applet의 초기크기이다.

▶ align - 이 속성은 applet의 정렬방식을 지정한다. 기본적으로 두가지가 있다.

애플릿이 블록(block)인 경우 텍스트는 applet 주위에, 애플릿이 인라인(inline)인 경우에는 확대된 텍스트 문자인 것처럼 보이게된다.

▷ 코딩을 위한 applet attribute

▶ CODE - 이 태그에는 클래스 파일의 이름을 쓴다. 이 이름은 현재 HTML이 있는 곳으로부터 상대적인 값으로 취해진다.
                  이것은 local 디렉토리이거나 네트웍 URL이 될 수 있고 절대 경로 이름도 사용될 수 있다. 즉 C:/a.html

▶ CODEBASE - 이 속성은 선택적으로 사용할 수 있다. 현재 HTML문서가 위치한 디렉토리의 아래의 CODEBASE의 tag값에서 클래스 파일을 찾을 수 있음을 브라우저에 알린다. 예를 들어 아래의 코드는 MyWork/java/samples/HelloWorld.class의 바이트 코드를 읽어온다.

<applet code=HelloWorld codebase=MyWork/java/samples width=100 height=100>

▶ Archive

- 자바 1.1에서는 여러 파일을 압축하여 한번에 다운로드할 수 있도록 jar(Java ARchive)를 지원하는데 브라우저가 서버로부터 다운로드해야 할 jar 파일이 있을 때 사용한다.

archive = "mysamples.jar, morefiles.jar"

- JAR를 사용하면 파일(바이트코드)의 다운로드 속도를 상당히 개선할 수 있으며 파일의 관리도 매우 편리하게 된다. 이러한 기술은 HTTP의 요구가 많은 소용량의 파일을 포함하는 JAR 파일을 로드함이 필요함에도 불구하고 로드 프로세서의 속도를 현저하게 증가시킨다.
(100개의 파일인 경우 100번 연결을 줄일수 있다)

- Swing.jar or SwingAll.jar 파일은 1Mbyte 정도로 다운로드하기 힘들지만, 한번만 다운을 받으면 된다.

▷ PARAM 태그 - HTML 페이지로부터 애플릿에게 파라미터를 전달하는데 사용된다.

<param name=X value=ABC>

▶ value의 값은 String이어야 한다.

▶ 파라미터 값을 읽을 때에는 getParameter() 메소드를 사용한다.

String getParameter(String a)

▶ 위에서 name은 대소문자를 구분하지 않으나 (즉 섞어서 사용해도 되나) getParameter()이 리턴한 String 값은 대소문자를 구분하며 param 태그의 value에 지정된 값이 그대로 나타난다.

▶ 참고로 String 값은 해당 정수로 바꾸려면 parseInt()를 사용한다. 예를들어 파라미터 name이 AGE인 경우 이를 받아 정수값으로 변환하려면 다음과 같이 한다.

int age = 0;

age = Interger.parseInt(getParameter("AGE"));

▶ getParameter() 호출시 해당 파라미터가 HTML 페이지 내에 없으면 null-pointer exception이 발생한다.

▶ 주의: <param> 태그는 반드시 <applet>와 </applet> 사이에 와야 한다.

Applet에서의 추가 메쏘드

▷ 자바에서 애플릿 프로그램을 작성하기 위해서는 반드시 Applet 클래스로부터 계승된 클래스를 사용하여야 하는데 Applet 클래스는 java.applet 패키지에 속해 있다. Applet클래스의 주요 메소드는 다음과 같다.

URL getCodeBase();/* 코드 URL을 얻는다 */

URL getDocumentBase();/* 도큐멘트 URL을 얻는다 */

Image getImage(URL);/* URL로부터 이미지를 얻는다 */

Image getImage(URL, String); /* URL로부터 name에 해당하는 이미지를 얻는다 */

void play(URL);/* 해당 URL의 오디오 파일을 연주한다 */

void showDocument(URL);/* URL의 도큐멘트를 보여준다 */

getDocumentBase() - 현재 나타나고 있는 페이지의 HTML 문서가 있는 디렉토리를 URL 타입으로 리턴한다.

getCodeBase() - 애플릿 코드를 가져온 곳의 디렉토리를 URL 타입으로 리턴한다.

getImage(URL base, String target) - URL 위치에 있는 target이름의 image를 가져 온다.

getAudioClip(URL base, String target) - URL 위치에 있는 target 이름의 AudioClip을 가져온다.

Posted by 인천총각
|