사용자 interface의 구현(B15)사용자 interface를 위한 event, componet등의 class로 구성된 Package

그림 1 : Component구성
실지로 화면을 그리는 부분을 update method에 구현하고 paint함수는 update함수만 부르게 함으로써 system에서 화면을 그리는 부분과 사용자가 repaint를 사용하여 화면을 그리는 부분을 동일시 한다.
Windows95 환경에서 GDI Resource를 Free시켜줄 방법이 없다.
그림 2
원하는 event가 아닐때는 super class의 handleEvent를 수행한다. 그렇지 않으면 다른 evnet가 수행되지 않는다.
참고 : http://www.javasoft.com/books/Series/Tutorial/ui/layout/using.html
class를 implement Layout형태로 만들고 LayoutManager에 있는 5가지 method를 구현해 준다.
Container에 component를 add하기전에 setLayout함수를 이용하여 Layoutmanager를 설정한다.
SetSizeFrame frm = new SetSizeFrame(this, applet);
frm.tfWidth.setText(Integer.toString(dimension.width));
frm.tfHeight.setText(Integer.toString(dimension.height));
frm.tfComment.setText(comment);
frm.pack();
frm.show();
applet.disable();
/**
* A container class that can scroll area with scrollbar
*
* @version 1.0 03/24/96
* @author Kang, Dae Woong (namu@star.elim.net)
*/
class ScrollPanel extends Panel
{
/**
* The target panel that will be scrolled
*/
WorkPanel target;
/**
* Scrollbars that will be displayed in south, east.
*/
Scrollbar scbVertical, scbHorizontal;
/**
* Constructs a ScrollPanel with a WorkPanel
* @param target that will be scrolled
*/
public ScrollPanel(WorkPanel target)
{
this.target = target;
setLayout(new BorderLayout());
add("Center", target);
add("South", scbHorizontal = new Scrollbar(Scrollbar.HORIZONTAL,
0, 100, 0, 200));
add("East", scbVertical = new Scrollbar(Scrollbar.VERTICAL));
}
/**
* set Scrollbar values
*/
public void layout()
{
Dimension dm;
super.layout();
dm = target.size();
if (dm.height < target.dimension.height)
{
scbVertical.enable();
scbVertical.setValues(scbVertical.getValue(), dm.height, 0,
target.dimension.height);
}
else
{
scbVertical.disable();
}
if (dm.width < target.dimension.width)
{
scbHorizontal.enable();
scbHorizontal.setValues(scbHorizontal.getValue(), dm.width, 0,
target.dimension.width);
}
else
{
scbHorizontal.disable();
}
}
/**
* handle Scrollbar event
*/
public boolean handleEvent(Event e)
{
if (e.target == scbVertical || e.target == scbHorizontal)
{
Scrollbar scr = (Scrollbar) e.target;
int val = 0;
int tmp;
boolean isDefault = false;
switch (e.id)
{
case e.SCROLL_ABSOLUTE:
val = ((Integer)e.arg).intValue();
break;
case e.SCROLL_LINE_DOWN:
tmp = scr.getValue() + scr.getVisible()/10;
scr.setValue((tmp + scr.getVisible() >
scr.getMaximum()) ? scr.getMaximum()
- scr.getVisible() : tmp);
val = scr.getValue();
break;
case e.SCROLL_LINE_UP:
scr.setValue(scr.getValue() - scr.getVisible()/10);
val = scr.getValue();
break;
case e.SCROLL_PAGE_DOWN:
tmp = scr.getValue() + scr.getVisible();
scr.setValue((tmp + scr.getVisible() >
scr.getMaximum()) ?
scr.getMaximum() - scr.getVisible() : tmp);
val = scr.getValue();
break;
case e.SCROLL_PAGE_UP:
scr.setValue(scr.getValue() - scr.getVisible());
val = scr.getValue();
break;
default:
isDefault = true;
}
if (!isDefault)
{
if (e.target == scbVertical)
target.ptScroll.y = val;
else
target.ptScroll.x = val;
target.repaint();
return true;
}
}
return super.handleEvent(e);
}
}
/**
* A class where draw the drawing
*
* @version 1.0 03/24/96
* @author Kang, Dae Woong (namu@star.elim.net)
*/
class WorkPanel extends Panel
{
Point ptScroll = new Point(0, 0);
Dimension dm = size();
public boolean handleEvent(Event e)
{
e.translate(ptScroll.x, ptScroll.y);
return super.handleEvent(e);
}
public void paint(Graphics g)
{
update(g);
}
public void update(Graphics g)
{
Rectangle clipRect;
g.clipRect(0, 0, dimension.width, dimension.height);
clipRect = g.getClipRect();
clipRect.translate(ptScroll.x, ptScroll.y);
offGraphics.translate(-ptScroll.x, -ptScroll.y);
offGraphics.setColor(getBackground());
offGraphics.fillRect(clipRect.x, clipRect.y, clipRect.width,
clipRect.height);
....
}
.....
}