height="99" border="0" alt="프로그래밍 헬프 코드">
width="74" height="33" border="0" alt="back button">
size="2" color="teal">이 곳은 앞으로 제가 작업을
했었던 소스를 중심으로 올립니다. 재 사용을 위해서 가능한
한 일반적인 경우에 사용할 수 있도록 고치겠지만 패키지로
만들 정도는 아닐 겁니다. 소스 상태로 제공되며 필요한
기능은 조금씩만 수정하면 원하시는걸 빠른 시간에 만들
수 있지 않을까 해서 시작했습니다. 지루하며 반복적인
작업에 많은 시간을 투자하기는 아깝잖아요. 한가지 더
테스트 적인 소스도 올립니다. 아무쪼록 도움이 되었으면
좋겠네요. |
Contents
-
size="2">MyJtableView Calss
-
size="2">중복된 데이터를 제거하는 알고리즘( avoidDup )
size="2">
-
size="2">마우스커서 모래시계로 만들기
-
size="2">DefaultTableModel을 이용하여 간단하게 테이블에 데이터를
추가하고 삭제하기
-
size="2">StringBuffer를 이용한 퍼포먼스 향상
size="2">
-
size="2">SwingUtilities를 이용한 마우스 버튼 감지하기
size="2">
-
size="2">스레드를 이용하여 화면 빨리 띄우기
size="2">
-
size="2">프레임에 아이콘 설정하기
-
size="2">자동으로 페이지 이동하기
-
size="2">MS Access 2000 mdb파일을 Windows NT에서 사용하면?
size="2">
-
size="2">DB에서 데이터를 얻어와 JTable에 보여주기
-
size="2">JTable에서 팝업 메뉴 띄우기
- 난수
발생
Update 2001.6.25
1. MyJTableView Class
설명 : 이 클래스는
size="2" color="green">온라인 스윙 튜토리얼을
토대로 작성되었습니다. 단계별로 하나씩 하나씩 기능을 구현해 놓은
튜토리얼에서 필요한 기능을 제가 짜집기 해서 하나로 묶었습니다.
size="3">A. 실행 화면
border="0">
B.
기능
- 단일 또는 멀티로
선택 모드 변경 가능
- 컬럼의 넓이 조정
가능
- 특정 셀에 컴포넌트
설치 가능
- 특정 셀에 마우스
툴팁 설치 가능
- 특정 컬럼 헤더에
툴팁 설치 가능
- 사용자의 선택 셀
감지 가능
- 변경된 셀의 값을
감지 가능
- 컬럼 정렬 가능
C.
필요한 클래스 (마우스 오른쪽 버튼이용)
D. 실행 방법
위의 모든 클래스가 같은
디렉토리에 존재해야 합니다. 소스를 보시면 알겠지만 맨 위에 모두
같은 패키지로 되어있습니다. 컴파일시 옵션 주는거 잊지 마세요.
- 컴파일 : javac -d
[경로] *.*
- 실 행
: java [경로].mypackage.MyJTable
Update 2001.7.8
2.
중복된 데이터를 제거하는 알고리즘( avoidDup )
문제 발생
일차원배열에 중복된 데이터가
들어있습니다. 이 데이터에서 중복되지 않은 데이터만을 필요로 하는
경우가 있습니다. 데이터 베이스에도 distinc라는게 있죠. 그와 같은
기능을 한다고 보시면 됩니다.
소스 설명
입력 데이터 Object[]
data={10,10, 10, 20, 30, 20, 30, 40, 10, 60, 60, 30} 결과 데이터
10, 20, 30, 40, 60
입력 데이터를 Parameter로
주면 결과 데이터를 Object[] 의 형태로 리턴해 줍니다. 두 개의 Vector와
두 개의 Enumeration을 이용하여 중복된 데이터를 제거하고 있으며 소스
내에서 붉은색으로 굵게 표시한 부분이 제가 고생한 부분입니다. 저걸
찾느라 Vector의 구조를 한참 상상했거든요. 설명하자면 벡터는 remove
하면 바로 삭제됩니다. Enumeration이 참조 하고 있다고 하지만 상관하지
않고 제거해 버립니다. 제거한 다음은 나머지 데이터로 빈 자리를 채웁니다.
결국 동적으로 제거되고 있는 Vector에서 그걸 참조하는 Enumeration의
인덱스를 처음으로 돌려놓지 않으면 놓치는 데이터가 생긴다는 겁니다.
곰곰히 생각하시면 다 아실 겁니다.
버그리포트
비교적 간단한 데이터의
배열에선 제대로 작동하지만 특수한 경우에 원하는 데이터가 나오지
않을 수도 있습니다. 그럴 경우에는 아래 주소로 자세한 데이터 형태와
함께 메일을 보내주시면 감사하겠습니다.
GYRO@LYCOS.CO.KR
( 첫 페이지에 메일을 보낼
수 있는 링크가 있습니다. )
private Object[] avoidDup(Object[] _data)
{ Vector
v1 = new Vector(); Vector
v2 = new Vector(); Enumeration
e1 = v1.elements(); Enumeration
e2 = v1.elements(); for(int
i=0; i<_data.length; i++) {
v1.add(_data[i].toString());
}
while(e1.hasMoreElements())
{ Object
key = e1.nextElement(); while(e2.hasMoreElements())
{
if(key.toString().equals(e2.nextElement().toString()))
{
v1.remove(key);
color="blue"> e2 = v1.elements();
}
}
e2 =
v1.elements(); e1
= v1.elements(); v2.add(key);
}
return
v2.toArray(); } |
Update 2001.7.12
▷ 아는게 힘 ◁
얼마전에 자바에서 중복을
제거해주고 소트까지 해주는 클래스를 보았습니다. 역시 아는 것이 힘이네요.
저걸 생각해 내느라 집에 돌아오는 지하철에서 내내 고민했었는데 간단하게
자바가 해결해 주네요. 잠깐 읽어보았는데 C++의 STL같은 것이라고 합니다.
나중에 더 공부하고 쉽게 사용하는 방법을 올리겠습니다.
그러니,
위의 소스는 절대 사용하지 마세요. 쫄팔리지만 지우지 않고 냅둡니다.
^^
Update
2001.7.19
▶
java.util.HashSet
위에서 정말
어렵게 중복되는 데이터를 제거하는 알고리즘을 소개했었습니다.
이를 자바가 제공하는 자료구조 클래스를 이용하여 간단하게 해결해
보도록 하지요.
Set
size="2" color="blue"> 인터페이스는 중복을
허용하지 않는 객체 집합을 말합니다. 이 인터페이스를 구현한
HashSet
클래스를 사용하겠습니다.
import
java.util.*;
public class test {
public
static void main(String[] args) {
Object[]
data= {"A", "A", "B",
"B", "C", "C", "A",
"E", "D", "D"};
color="blue"> HashSet hs = new HashSet();
for(int
i=0; i<data.length; i++) {
hs.add(data[i]);
}
Iterator
i = hs.iterator(); while(i.hasNext())
{
System.out.print(i.next().toString()
+ " "); }
}
}
결과 : A E D C B
|
▶
java.util.TreeSet
그럼
이번엔 중복 제거뿐만 아니라 결과 데이터를 정렬까지 해보겠습니다.
아까도
말했듯이 Set은 중복을 허용하지 않는 객체집합을 말합니다. 이
Set
color="black"> 인터페이스를 상속한 SortedSet
size="2" color="black">이란 인터페이스가 있습니다. 이름 대로
중복을 허용하지 않으면서 정렬시킨다는 겁니다. 바로 이 인터페이스를
구현한 TreeSet
size="2" color="black">을 이용하는 겁니다.
import
java.util.*;
public class test {
public
static void main(String[] args) {
Object[]
data= {"A", "A", "B",
"B", "C", "C", "A",
"E", "D", "D"};
TreeSet ts = new TreeSet();
for(int i=0; i<data.length; i++) {
ts.add(data[i]);
}
Iterator
i = ts.iterator(); while(i.hasNext())
{
System.out.print(i.next().toString()
+ " "); }
}
}
결과 : A B C D E
|
정말
어처구니 없게 너무나 간단합니다. 일단 문제가 발생하면 그런 기능을
제공하는 게 있나 먼저 확인하고 찾아봐야겠습니다. 무턱대고 없겠거니
짐작하고 혼자서 어렵게 구현하는 우를 범하지 않게 말입니다.
Update 2001.7.11
3. 마우스커서 모래시계로
만들기
이번엔 아주 간단한 마우스 커서를 모래시계로 만들어보겠습니다.
개발자들은 기능의 구현에 많은 집중력을 소비합니다. 그러다 보면 인터페이스나
사용자에 대한 응답들을 돌보지 않죠. 이것도 간단한 모래시계지만 빠트리고
지나치기 일수입니다. 그럼 소스를 보도록 하지요. 너무 간단해서 더
이상의 설명이 필요없습니다.
this.setCursor(new
Cursor(Cursor.WAIT_CURSOR
color="blue">));
많은 시간을 필요로 하는
작업
this.setCursor(new
Cursor(Cursor.DEFAULT_CURSOR
color="blue">)); |
위의 소스에서 this란 Frame을 말합니다. 즉 컴포넌트들이 올려져
있는 메인 프레임을 말하죠. 설명하자면 Frame에 있는 setCursor()메소드를
이용해서 커서의 모양을 바꾸겠다는 뜻이죠. 그럼 저 메소드가 어디에
있는지 한번 찾아가 보겠습니다.
java.awt.Frame
void setCursor (int cursorType)
Deprecated. As
of JDK version 1.1, replaced by Component.setCursor(Cursor) .
찾긴 찾았는데 Deprecated가 되 버렸습니다. 아울러 Frame에 있는거
말고 Component에 있는 메소드를 사용하고 하네요. 그럼 Component에서
다시 찾아보겠습니다.
java.awt.Component
void
setCursor
size="3">(Cursor cursor)
Sets
the cursor image to the specified cursor.
어렵지 않게 찾았습니다. Frame에 있는 메소드는 인자로 정수값을
주었는데 Component에 있는 것은 Cursor를 인자로 주는게 바뀌었을 뿐
같은 모양을 하고 있습니다.
생각해 보면 커서 모양을 설정하는 메소드가 Frame에 있지 않고 Component로
옮겨진 이유를 알 것 같습니다. Frame에 하나의 커서를 설정하는 것이
아니라 컴포넌트마다 각각 다른 마우스 커서를 설정할 수 있으니 setCursor()
메소드가 Component로 옮기는게 당연하죠.
Update 2001.7.11
4. JTable에
데이터 추가하고 삭제하기
javax.swing 패키지에 보면 JTable이란 클래스가 있습니다. 테이블이라
하면 잘 아실텐데 제가 헷갈렸던 부분이 있어서 올려봅니다. 단순하게
생각해서 테이블에 데이터를 추가하려고 한다면 JTable클래스의 메소드들
중에 있을 꺼라고 생각했습니다. 그런데 추가하거나 삭제하는게
color="red">테이블 모델이란 곳에 있더라구요. 그럼
소스를 보겠습니다.
DefaultTableModel
tableModel = new DefaultTableModel(); JTable table
= new JTable(tableModel);
// 테이블의 테이터를
삭제하기 int rowCount = tableModel.getRowCount();
for(int i=0; i<rowCount; i++) {
color="blue"> tableModel.removeRow(0);
}
data는 테이블에 추가하고
싶은 2차원배열.
//테이블에 데이터를 추가하기
int rowCount = 0; int columCount = 0; Object[]
temp = null; rowCount = data.length;
columnCount = tableModel.getColumnCount(); temp
= new Object[columnCount]; for(int i=0; i<rowCount;
i++) { temp[0] = data[i][0];
temp[1] = data[i][1]; temp[2]
= data[i][2]; :
:
tableModel.addRow(temp);
} |
테이블을 생성하는데 인자로 DefaultTableModel이란 놈을 넣고 있습니다.
DefaultTableModel이란 테이블을 처리하기 위한 좋은 메소드들을 가지고
있습니다. removeRow도 그렇고 addRow도 그렇고 모두가 DefaultTableModel이
갖고 있는 것들입니다. 이로써 우리들은 간편하게 테이블에 데이터를
추가하고 삭제 할 수 있는 것이죠. 이것 외에도 컬럼을 추가하기나 이동하기
등등 유용한 것들이 많이 있습니다.
Update 2001.7.11
5. StringBuffer를
이용한 퍼포먼스 향상
java.lang 패키지에는 String과 StringBuffer 클래스가 있습니다.
둘의 차이는 뭘까요? String은 문자열을 다루고 StringBuffer은 문자열을
버퍼를 이용해서 다룬다고 생각하시면 됩니다. 둘의 큰 차이는 스트링의
+ 연산에서 차이가 납니다. 그럼 소스를 보시겠습니다. 소스는 생략형으로
간단하게 적겠습니다.
String
data = "abcde"; for(int i=0; i<10000;
i++) { data += "abcde";
}
====================================
StringBuffer data = new
StringBuffer("abcde"); for(int i=0; i<10000;
i++) { data.append("abcde");
} |
위와 같은 소스를 실행시키면서 그 시간을 체크하면 다음과 같은
결과가 나옵니다.
String의
경우 : 23394 StringBuffer의 경우 : 10
|
실로 큰 차이를 보이고 있습니다. 문자열의 + 연산이 많은 곳에서는
StringBuffer을 사용하시는게 좋겠습니다. 가령 데이터베이스의 쿼리문을
만든다거나 할 때 사용하면 좋겠죠.
한가지 더 말씀드리자면 변경되지 않을 문자열에는
String클래스를 사용하고 변경될
수 있는 문자열들은 StringBuffer 클래스를 사용하십시요.
String객체는 상수이기 때문에 StringBuffer 객체보다 비용이 적게 들고
공유가 가능하다고 합니다. 이건 자바 튜토리얼에 있는 내용입니다.
참고서적 : 프로그램 세계 6월호,
자바 튜토리얼(장혜진 역, 에드텍)
Update 2001.7.12
6.
SwingUtilities를 이용한 마우스 버튼 감지하기
javax.swing 패키지 안에는 SwingUtilities 란 클래스가 있습니다.
이 클래스에는 간단하게 마우스의 버튼이 왼쪽이 눌렸는지 오른쪽이
눌렸는지 알아내는 메소드가 있습니다.
javax.swing.SwingUtilities
static boolean isLeftMouseButton(MouseEvent
anEvent) Return true if the moue event specifies
the left mose button.
static boolean isMiddleMouseButton(MouseEvent
anEvent) Return true if the mouse event specifies
the middle mouse button.
static boolean isRightMouseButton(MouseEvnet
anEvent) Returns true if the mouse event specifies
the right mouse botton.
인자로 MouseEvent를 받고 있습니다. 그럼 간단하게 사용하는 소스를
보죠.
import
javax.swing.*
public class GYRO extends
JFrame implements MouseListener { public
GYRO() {}
public
void mouseClicked(MouseEvent e) {
if(SwingUtilites.isRightMouseButton(e))
{ //마우스
오른쪽 버튼 }
if(
color="blue">SwingUtilites.isLeftMouseButton(e))
{ //마우스
왼쪽 버튼 }
if(
color="blue">SwingUtilities.isMiddleMouseButton(e
color="blue">)) {
//마우스
가운데 버튼 }
} public void
mousePressed(MouseEvent e) { } public
void mouseReleased(MouseEvent e) { } public
void mouseEntered(MouseEvent e) { } public
void mouseExited(MouseEvent e) { } }
|
Update 2001.7.12
7. 스레드를
이용하여 화면 빨리 띄우기
Swing을 이용하여 어플리케이션을 만들고자 하면 많은 Dialog와 Frame을
사용합니다. 그 중에서 Frame이 JTable을 포함하고 있으며 그 테이블은
데이터베이스의 정보를 얻어와 보여주는 경우가 종종 생기는데 이럴
때 화면에 보여주는 방법으로는
▶ 데이터를 먼저 처리하고 나중에 화면을 보여주는 방법
이 방법은 데이터가 로드되고 처리되는 동안 사용자는 아무 것도
보지 못합니다.
▶ 반대로 화면을 먼저 보여주고 데이터를 처리하는 방법
이 방법은 프레임이 먼저 보여지기 때문에 위 방법보다 낫다고 하겠습니다.
하지만 프레임은 보이지만 내부적으로 데이터의 처리가 남아있기 때문에
프레임에 올려놓은 각종 컴포넌트들을 볼 수 없습니다. 프레임은 화면에
떴지만 안은 아무것도 없는 썰렁한 화면이 떠 버리는거죠.
▶ 그럼 화면을 먼저 띄우고 스레드를 이용하여 데이터를 처리하는
방법
이 방법은 두 번째 방법을 보완한 것인데 프레임이 먼저 보이는 것은
같습니다. 게다가 보여진 프레임에 올려놓은 각종 컴포넌트들을 같이
볼 수 있습니다. 내부적으로 데이터의 처리가 남아 있지만 이를 스레드로
처리하기 때문에 프레임이 초기화를 끝내고 원하는 모양으로 보여지는
것입니다.
import
javax.swing.*;
public class GYRO extends
JFrame implements Runnable
{ public GYRO() {
//각종 컴포넌트를
초기한다.
this.pack();
this.setVisible(true);
color="blue"> Thread t = new Thread(this);
t.start();
}
public
void run() {
color="blue"> //작업시간이 오래걸리는 데이터
처리 } } |
Update 2001.7.29
8. 프레임에 아이콘 설정하기
자바 어플리케이션에 그림과 같이 프레임 아이콘을 설정하도록
하겠습니다.
ImageIcon
mainIcon = new ImageIcon("HanaroIcon.gif");
this.setIconImage(mainIcon.getImage()); |
Update 2001.7.29
9. 자동으로 페이지 이동하기
게시판을 여러번 만들면서 불편했던 것 중에 페이지를 자동으로 이동해야
할 때가 많습니다. 그렇지 않으면 일일이 쫒아다니면서 링크를 뜯어
고쳐야 하지요. 처음부터 정확하고 치밀한 설계를 했다면 문제가 되지
않겠지만 저처럼 무턱대고 만들어 놓기를 먼저하면 꼭 마지막에 가서는
페이지를 고쳐야 하는 경우가 생깁니다. 매번 인터넷을 뒤져서 페이지
자동 이동 스크립트를 가져다 쓰곤 했는데 하도 짜증나서 이렇게 help
code에 만들게 되었습니다. 보시면 이해가 되시겠지만 필요할 때 빨리
찾아지지 않으면 화가 나거든요.
1. <head></head>
안에 들어갈 스크립터 코드
<SCRIPT LANGUAGE="JavaScript">
function startTimer(){ var
time = new Date(); hours
= time.getHours(); mins
= time.getMinutes(); secs
= time.getSeconds(); closeTime
= (hours * 3600) + (mins * 60) + secs; closeTime
+= 0; Timer(); }
function Timer(){ var
time = new Date(); hours
= time.getHours(); mins
= time.getMinutes(); secs
= time.getSeconds(); curTime
= (hours*3600) + (mins*60) + secs; if(
curTime >= closeTime) location
=" 이동하고자 하는 페이지
"; } </SCRIPT>
2. <body></body>
안에 들어갈 Tag
<body onLoad="startTimer();"
.....> </body>
|
Update 2001.7.31
10.
MS Access 2000 mdb 파일을 Window NT에서 사용하면?
다음과 같은 에러 메시지를 볼 수 있습니다. 엑세스 2000이 NT4.0보다
나중에 나왔다는거 아시죠? 당연한걸 바보처럼 물어보냐고 하실지
모르지만 제가 이것 때문에 반나절은 고생했거든요. 집에서 윈도우2000을
사용하고 엑세스도 2000을 사용하고 있는데 회사 홈에 게시판을 만들
일이 생겼습니다. IBM 서버였는데 운영체제가 NT4.0었죠. 당연히 집에서
테스트 끝내고 완료됐다 싶어서 IBM 서버로 옮겼습니다. 그런데 계속
NullPointerException이 발생하는 것이었습니다. 소스를 이리 저리 고치며
디버깅 하다고 mdb에 연결을 하지 못한다는걸 알았고 IBM 서버의 ODBC
관리자를 열어보았더니 글세 인식할 수 없는 데이터 베이스 유형이라고
하네요. 아니 처음에 진작 연결할 때 이렇게 메시지 띄워줬으면 금새
끝날걸 반나절을 보내고 다시 연결할라고 하니 그제서야 그림과 같은
창이 뜨더라구요. 화딱지는 났지만 한편으론 문제를 해결했구나 하는
안도감이 들었습니다. 버전의 따른 간단한 실수였지만 미칠뻔 했습니다.
border="0">
Update 2001.9.2
11.
DB에서 데이터를 얻어와서 JTable에 보여주기
데이터 베이스와 연동하여 작업을 하다보면 데이터를 테이블 형태로
보여주는 경우와 갱신하는 경우 그리고 삭제하는 경우를 주로 많이 다룹니다.
이때 그 작업 결과를 테이블에 다시 반영해야 하는데 그 메소드를 소개하겠습니다.
소스도 간단하고 로직도 간단하지만 제가 한번 당한 적이 있어서 저
같은 실수하지 마시라고 올려봅니다.
소스
보충 설명 : 프로그램 실행시 DB연결이 되어 있는 상태이며, JTable은
DefaultTableModel을 사용합니다. JTable은 두 개의 필드를 가지고 있다고
가정하며, 이 메소드는 먼저 기존의 테이블에 삽입된 데이터를 모두
지우고 다시 데이터베이스에서 최신의 정보를 얻어온 다음 이를 다시
테이블에 보여주는 기능을 하고 있습니다. 결국 삽입이나 갱신 삭제와
같은 같은 작업을 한 후에 이 메소드를 호출하면 갱신된 내용을 다시
테이블에서 확인할 수 있습니다.
public void reloadTable() { int
rowCount = tableModel.getRowCount(); for(
int i=0; i<rowCount; i++) {
tableModel
color="red">.removeRow(0); }
try{
st
= con.createStatement(); sql
= "select * from " + tablename; rs
= st.executeQuery(sql);
Object[]
data = new Object[2]; while(
rs.next() ) {
data[0]
= rs.getString("col_name1"); data[1]
= rs.getString("col_name2");
tableModel.addRow(data);
}
}catch(SQLException
e){ }
}
주의 : 빨간색을 조심하세요.
너무 간단하서 가끔 i라는 변수를
넣는 실수를 하곤 합니다. 그러면 아마 ArrayIndexOutOfBoundException을
보실수 있습니다. 반드시 0은 아니지만 테이블의 필드의
객수보다는 작아야 합니다. 가령 테이블의 필드가 4개라면
그 보단 작은 0, 1, 2, 3 이면 상관없겠죠. 저 놈 잡느라
한시간 반이 걸렸었죠. 얼마나 허무했던지..
|
Update 2001.9.4
12. JTable에서 팝업
메뉴 띄우기
테이블의 필드 위에 마우스를 갖다대고 팝업 메뉴를 띄우는 소스입니다.
주로 삭제나 변경을 팝업 메뉴로 하기도 합니다. 주 기능이라기 보다는
버튼으로 삭제나 변경이 있지만 사용자의 편리성을 위해서 팝업 메뉴를
만듭니다. 그럼 간단 소스를 보시죠.
public
class GyroPopUpView extends JFrame implements MouseListener,
ActionListener { JPopupMenu
popupMenu; JMenuItem
menuItem;
public
void mousePressed(MouseEvent e) {
if(
SwingUtilities.isReightMouseButtio(e)
) {
int
rightClickedRow = table.rowAtPoint(e.getPoint());
table.setRowSelectionInterval(
rightClickedRow, rightClickedRow );
popupMenu
= new JPopupMenu(); menuItem
= new JMenuItem("삭제"); popupMenu.add(menuItem);
menuItem.addActionListener(this);
if(
e.getSource().equals( table ) ) {
popupMenu.show(table,
e.getX(), e.getY() ); popupMenu.setVishble(
true ); }
}
}
public
void actionPerformed( ActionEvent e ) {
if(
e.getSource().equals( menuItem )) {
color="blue"> /* to do */
}
} }
SwingUtilities에
아주 간단하게 마우스의 오른쪽 버튼이 눌린걸 알아낼 수
있습니다. 밑의 to do 다음에는 원하는 작업을 하시면
됩니다. 대부분 대화 상자를 보여주는 메소드를 호출하지만
뭐 나름대로 구현을 해 놓으시면 됩니다. 리스너는
MouseListener과 ActionListener 두 개를 implements 하는거
잊지 말고요. |
13. 난수 발생
0부터 10까지의 난수 발생 방법
- int val = (int)(Math.random() + 11.0 ) ;
- Random r = new Random();
int val = r.nextInt( 10 );
width="74" height="33" border="0" alt="back button">
GYRO is Chun Gyu
Yong's nickname.
size="2" color="black">SINCE 1999. copyright by
size="2" color="purple">GYRO.
GYRO@LYCOS.CO.KR |