프로그래밍/JAVA2009. 7. 14. 11:43
1. SWT란?
java에서 GUI를 지원하기 위한 도구로 sun에서 개발한 Swing이 널리 사용되고 있었는데, IBM에서 통합개발 플랫폼인 Eclipse를 개발하면서 Swing 대신 자체적으로 개발한 GUI라이브러리를 제작한다. 이게 SWT 이다.

  • Swing: J2SE를 위한 GUI 툴킷 
  • SWT: IBM의 공개 프로젝트인 Eclipse 플랫폼의 제작을 위해 별도로 개발된 라이브러리

SWT는 Standard Widget Toolkit의 줄임말로 각 운영체제자체에서 제공되는 위젯 툴킷을 통합한 그래픽 라이브러리다. 이는 각 타겟 플렛폼에 꽤나 의존적이 될 수도 있음을 의미하지만, OS독립적인 API를 제공함으로써 이 문제를 해결하고 있다. 이들 API는 목표가 되는 운영체제 시스템의 GUI코드를 wrapper함으로써 개발자 입장에서는 운영체제에 신경쓰지 않고 동일한 코드를 유지할 수 있게 된다. 

덧붙여 설명하자면, Swing은 모든 위젯이 운영체제와 별개를 사용하는데(자바의 모토가 One make All use 아니던가) 그렇기때문에 Swing의 GUI는 웬지 눈에 낯설고 어색해 보이는 면이 있어왔다. 그러나 SWT는 가능한한 사용할 수있는 모든 Native Widget은 사용하고, 그러하지 않는 부분만 자바의 자체 위젯을 사용한다. 때문에 최대한 그 OS의 Native GUI와 비슷한 모습을 보여주는것이다.(Native에서 제공하지 않는 자체 위젯까지 포함하므로 때론 더 이쁠수도 있겠다. 물론 반대인 경우도 있겠지만). 

그럼 자바가 시스템에 독립적이지 않은게 아닌가? 하고 반문할지 모르지만 위에 설명된 바와같이 공통적인 API를 사용하므로서 (Abstract Layer라고 볼 수 도 있겠다) OS가 다르다고 해서 소스코드의 변경을 필요로 하지 않는것이다. (VM차원에서 Native Widget를 해당 API로 랩핑해주므로)



2. JFreeChart
Java 기반 오픈소스 챠트 라이브러리이다. API는 무료이지만 개발자 메뉴얼은 유로로 배포하고 있다.



3. SWT에서 JFreeChart 사용하기
SWT_AWT 브릿지를 이용하는 방법과 Graphics2D를 사용하는 방법이 있다.


다음은 Graphics2D를 이용해 Dynamic chart(JVM 메모리 사용량 모니터링)를 생성하는 샘플 코드이다.
import org.eclipse.swt.widgets.Display;

public class DataGenarator extends Thread {

	private Display display = null;
	
	private MemoryMeter memoryMeter = null;
	
	private int inteval = 0;
	
	DataGenarator(Display display, MemoryMeter memoryMeter, int inteval) {
		this.display = display;
		this.memoryMeter = memoryMeter;
		this.inteval = inteval;
	}
	
	static Runtime runtime = Runtime.getRuntime();
	
	@Override
	public void run() {
		while( !Thread.currentThread().isInterrupted() ) {
			display.asyncExec(new Runnable() {
				public void run() {
					memoryMeter.addTotalObservation(runtime.totalMemory());
					memoryMeter.addFreeObservation(runtime.freeMemory());
				}
			});
			
			try {
				Thread.sleep(inteval);
			} catch (InterruptedException e) {
				Thread.currentThread().interrupt();
				return;
			}
		}
	}
	
}
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.experimental.chart.swt.ChartComposite;
import org.jfree.ui.RectangleInsets;

public class MemoryMeter {
	
	private TimeSeries total = null;
	
	private TimeSeries free = null;
	
	public MemoryMeter(int i) {
		total = new TimeSeries("Total Memory");
		total.setMaximumItemAge(i);
		free = new TimeSeries("Free Memory");
		free.setMaximumItemAge(i);
	}
	
	public JFreeChart createChart() {
		TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
		timeseriescollection.addSeries(total);
		timeseriescollection.addSeries(free);
		
		DateAxis dateaxis = new DateAxis("Time");
		NumberAxis numberaxis = new NumberAxis("Memory");
		dateaxis.setTickLabelFont(new Font("SansSerif", 0, 12));
		numberaxis.setTickLabelFont(new Font("SansSerif", 0, 12));
		dateaxis.setLabelFont(new Font("SansSerif", 0, 14));
		numberaxis.setLabelFont(new Font("SansSerif", 0, 14));
		
		XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer(true, false);
		xylineandshaperenderer.setSeriesPaint(0, Color.red);
		xylineandshaperenderer.setSeriesPaint(1, Color.green);
		xylineandshaperenderer.setSeriesPaint(2, Color.blue);
		xylineandshaperenderer.setBaseStroke(new BasicStroke(3F, 0, 2));
      
		XYPlot xyplot = new XYPlot(timeseriescollection, dateaxis, numberaxis, xylineandshaperenderer);
		xyplot.setBackgroundPaint(Color.lightGray);
		xyplot.setDomainGridlinePaint(Color.white);
		xyplot.setRangeGridlinePaint(Color.white);
		xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
      
		dateaxis.setAutoRange(true);
		dateaxis.setLowerMargin(0.0D);
		dateaxis.setUpperMargin(0.0D);
		dateaxis.setTickLabelsVisible(true);
		numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
      
		JFreeChart jfreechart = new JFreeChart("JVM Memory Usage", new Font("SansSerif", 1, 24), xyplot, true);
		jfreechart.setBackgroundPaint(Color.white);
      
		return jfreechart;
	}
	
	public void addTotalObservation(final double d) {
		total.addOrUpdate(new Millisecond(), d);
	}
	
	public void addFreeObservation(final double d) {
		free.addOrUpdate(new Millisecond(), d);
	}
	
	public static void main(String args[]) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setSize(600, 300);
		shell.setLayout(new FillLayout());
		shell.setText("Memory Usage Demo");
	   
		MemoryMeter memoryMeter = new MemoryMeter(30000);
		JFreeChart chart = memoryMeter.createChart();

		ChartComposite chartComposite = new ChartComposite(shell, SWT.NONE, chart, true);
		chartComposite.setDisplayToolTips(true);
		chartComposite.setHorizontalAxisTrace(false);
		chartComposite.setVerticalAxisTrace(false);
		shell.open();
	   
		Thread dataGenarator = new DataGenarator(display, memoryMeter, 100);
		dataGenarator.start();
		
		while( !shell.isDisposed() ) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		dataGenarator.interrupt();
	}

}
실행그림은 다음과 같다.


'프로그래밍 > JAVA' 카테고리의 다른 글

Java 쓰레드  (0) 2009.12.04
스트러츠 properties 한글 편집  (0) 2009.12.03
Java XML Parser JDOM  (2) 2009.09.03
JRE Detection  (0) 2009.08.11
자바 웹 스타트(Java Web Start)  (0) 2009.08.07
JFreeChart with SWT  (0) 2009.07.14
자바 데몬(daemon) 만들기  (2) 2009.07.08
LRU 캐쉬 엔진의 구현  (0) 2009.06.26
JAVA Memory Leak  (2) 2009.06.25
Out Of Memory Error(OOME)에 대하여  (0) 2009.06.25
JAVA Heap 메모리 모델  (2) 2009.06.24
Posted by devop

댓글을 달아 주세요