import java.util.Locale;
import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

public class TestDate 
{
 public static void main(String args[]) 
 {
  int     iWeekName;
  int     nMoveDay;
  int     nEndDay;
  long     lCurTime;
  long    lCurTimeTemp;
  long    lDiff;
  Date     curDate;
  Date     curDateTemp;
  String     strCurTime;
  Calendar    cal;
  GregorianCalendar  gcal;
  SimpleDateFormat  sdf;
  
  // ---------------------------------------------------------------
  // 1. 시스템의 밀리초 구하기(1000은 1초)
  // ---------------------------------------------------------------
  lCurTime = System.currentTimeMillis();
  System.out.println(lCurTime);
  
  // ---------------------------------------------------------------
  // 2. 현재 시각을 가져오기
  // ---------------------------------------------------------------
  curDate = new Date();  
  System.out.println(curDate);

 

  // ---------------------------------------------------------------
  // 3. 포맷을 지정해서 날짜 구하기
  // ---------------------------------------------------------------
  sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.0Z'", Locale.KOREA); 
  curDate = new Date();                                 
  strCurTime = sdf.format(curDate);
  System.out.println(strCurTime);

                                    

  // ---------------------------------------------------------------
  // 4. Date를 Calendar로 맵핑하기
  // ---------------------------------------------------------------
  curDate = new Date();
  cal = Calendar.getInstance();
  cal.setTime(curDate);
  System.out.println(cal.get(Calendar.YEAR) + "년" 
      + (cal.get(Calendar.MONTH) + 1) + "월"
      +  cal.get(Calendar.DAY_OF_MONTH) +"일");
  
  // ---------------------------------------------------------------
  // 5-1. 날짜를 n일 만큼 이동시키기
  // ---------------------------------------------------------------
  curDate = new Date();
  lCurTime = curDate.getTime();
  nMoveDay = 1;
  lCurTime = lCurTime + (24*60*60*1000) * nMoveDay;
  System.out.println(lCurTime);
  
  // ---------------------------------------------------------------
  // 5-2. 날짜를 n일 만큼 이동시키기                           
  // ---------------------------------------------------------------
  cal = Calendar.getInstance ( );                                                              
  cal.add(cal.MONTH, -2);    // 2달 전         
  cal.add(cal.DAY_OF_MONTH, 2);  // 2일 후
  cal.add(Calendar.YEAR, 2);   // 2년 후
  System.out.println(cal.get(Calendar.YEAR) + "년" 
      + (cal.get(Calendar.MONTH) + 1) + "월"
      +  cal.get(Calendar.DAY_OF_MONTH) +"일");
  
  // ---------------------------------------------------------------
  // 6-1. 해당하는 달의 마지막 일 구하기
  // ---------------------------------------------------------------
  gcal = new GregorianCalendar();
  nEndDay = gcal.getActualMaximum((gcal.DAY_OF_MONTH));             
  System.out.println(nEndDay);

 

  // ---------------------------------------------------------------
  // 6-2. 해당하는 달의 마지막 일 구하기
  // ---------------------------------------------------------------
  cal = Calendar.getInstance ( );            
  cal.set(2009, 1, 1);    //월은 0부터 시작
  nEndDay = cal.getActualMaximum(Calendar.DATE);
  System.out.println(nEndDay);
  
  // ---------------------------------------------------------------
  // 7. 요일 구하기                                              
  // ---------------------------------------------------------------
  cal= Calendar.getInstance ( );                    
  iWeekName = cal.get(Calendar.DAY_OF_WEEK); // 1이면 일요일, 2이면 월요일... 7이면 토요일        
  
  // ---------------------------------------------------------------
  // 8. 날짜 유효 검사
  // ---------------------------------------------------------------
  //String result = "";                                         
  sdf = new SimpleDateFormat("yyyyMMdd", Locale.KOREA);                                                 
  // 일자, 시각해석을 엄밀하게 실시할지 설정함  true일 경우는 엄밀하지 않는 해석, 디폴트       
  sdf.setLenient (false);                                           
  try {                                            
   curDate = sdf.parse("20090229"); 
  }
  catch(java.text.ParseException e) {             
   System.out.println("Error");
  }
  
  // ---------------------------------------------------------------
  // 9. 두 날짜 비교하기                                 
  // ---------------------------------------------------------------
  curDate = new Date();
  curDateTemp = new Date();

  lCurTime = curDate.getTime();                     
  lCurTimeTemp = curDateTemp.getTime();                     
                                                     
  lDiff = lCurTimeTemp - lCurTime;
  cal= Calendar.getInstance();          
  cal.setTimeInMillis(lDiff);   // 결과값이 몇시간, 몇일 차이나는지 확인하기 위해선.
 }
}

'자바 > 자바팁' 카테고리의 다른 글

객체직렬화 설명  (0) 2010.10.29
objectinputstream 생성시 주의사항  (0) 2010.10.28
클래스패스 설정  (0) 2010.10.25
Borderlayout 기본설명  (0) 2010.10.21
에코 클라이언트 과정  (0) 2010.10.21


로그인UI랑 조금 수정된 파일

5번째 만든 내 맘대로 만든 채팅소스...ㅋㅋ

'자바 > 채팅방' 카테고리의 다른 글

자바로그인UI가 추가된 소스  (0) 2010.10.27
swing으로 만든 멀티채팅소스  (0) 2010.10.27
자바 멀티채팅클라이언트 기본소스  (0) 2010.10.24
자바 멀티서버 기본소스  (0) 2010.10.24
채팅방클라이언트  (0) 2010.10.22

클래스패스와 환경 변수, 그것이 알고 싶다.
김세곤
2001년 4월 17일

서론
초보 자바 프로그래머를 괴롭히는 큰 문제 중에 그놈의 클래스패스는 빠지지 않는다. 클래스패스는 사실 이렇게 하나의 글로 설명하기조차 매우 부끄러운 사소한 것인데, 초보 자바 프로그래머에게는 절대 사소하지 않은 것이 현실이다. 더군다나, 가슴 아프게도 대부분의 자바 관련 서적은 클래스패스에 지면을 할애할 만한 형편도 안되고, 대부분의 저자들이 별것도 아닌 것에 공들여 설명하려 하지 않기 때문에, 당연히 클래스패스에 대해서는 많은 독자들이 제대로 이해하지 못한 채 끙끙댄다. 한편으로는, 이것은 기초를 제대로 다지지 않은 독자들의 책임이 크다. 클래스패스를 잘 설정해서 자바 프로그램을 컴파일하고 실행하는 기술은 자바 언어의 첫번째 단추이고, 이 내용은 대부분의 자바 책(자바 관련 서적이 아닌 자바 그 자체를 설명하는 책)에서는 설명이 되어 있기 때문이다.

필자는 JSP Bible이라는 책을 집필하고 독자로부터 많은 질문을 받았는데, 거짓말 보태지 않고 50% 이상의 독자가 클래스패스로 골머리를 썩고 있었다. JSP로 웹 개발을 시도하려 한다면 자바 언어의 첫번째 단추인 클래스패스와 컴파일 정도에는 문제가 없어야 하는데, 아쉽게도 이 첫번째 단추를 못 껴서 진도를 못 나가다니 가슴 아픈 현실이 아닐 수 없다.

가장 좋은 방법은 역시 자바 언어를 제대로 공부하고 나서 JSP, Servlet, EJB 등 그 다음 단계의 공부를 진행하는 것이다. 그런데, 이유야 어찌 됐건, 대부분의 독자들은 자바에 대한 기초없이 응용 단계인 JSP, Servlet, EJB 등으로 마구 앞질러 나간다. 그리고, 막히면 다시 자바 언어를 체계적으로 공부하지 않고, 끙끙거리며 당장 진도를 나가려고 발버둥친다. 이 대목에서 찔리는 독자 여러분들이 분명히 많을 것이다.

솔직히 말해서, 필자는 JSP Bible 집필 당시에 자바의 생기초라 할 수 있는 클래스패스 설정하기 및 컴파일하기 등에 대해서 이렇게 많은 독자들이 모르리라고 예상하지 못했다. 그리고, 끊임없이 클래스패스에 대한 질문을 받으면서, 같은 답변을 계속 하다보니 이제는 클래스패스에 대한 질문만 만나면 경기가 난다.

필자는 이 글로 더 이상 클래스패스나 환경 변수 혹은 컴파일하기 등에 관련된 질문이 없기를 간절히 기대한다. 더 나아가서 많은 자바를 공부하고자 하는 개발자들이 제발 자바 언어에 대해서는 탄탄하게 기초를 다졌으면 한다.

클래스 이름과 패키지
갑돌이가 A.java 라는 자바 프로그램을 만들었다고 하자. 그리고, 자신의 컴퓨터 C 드라이브의 myClass라는 폴더에 A.java를 컴파일한 A.class를 넣어 두었다고 치자. 그리고는 A.class를 잘 사용하다가 어느날 똑순이가 만든 클래스를 사용할 일이 있어서 똑순이의 클래스들을 건네 받았는데, 그 중에 A.class라는 같은 이름의 클래스가 있다는 사실을 알았다. 갑돌이는 갑자기 답답해졌다. 자, 어찌 하면 갑돌이가 만든 클래스 A와 똑순이가 만든 클래스 A를 구별할 수 있을까?

해답은 바로 패키지이다.

갑돌이의 회사는 gabdol이고, 똑순이의 회사는 ddogsun이므로, 이 이름을 클래스 이름 A에 붙여쓰면 구별이 될 수가 있는 것이다. 갑돌이의 클래스 A의 이름을 gabdol.A로 똑순이의 클래스 A의 이름을 ddogsun.A로 사용하면 고민이 해결된다는 말이다. 그런데, 덕팔이의 회사 이름이 갑돌이의 회사 이름과 같다면 또 이름이 충돌하게 된다. 그렇다면 전세계에서 유일한 이름을 클래스 이름 앞에 붙여주면 아주 간단해진다. 전세계에서 유일한 이름으로는 머리속에 팍 떠오르는 것이 회사의 도메인 명이다. 갑돌이네 회사가 www.gabdol.com이라는 도메인 이름을 소유하고 있다면, 갑돌이네 회사에서 만드는 모든 클래스의 이름을 com.gabdol.A와 같은 식으로 만들면 문제가 해결된다. 바로, 이 com.gabdol이 클래스 A의 패키지 이름이 되는 것이다. 만일, 갑돌이네 회사가 두 개의 자바 소프트웨어를 개발했는데, 둘 다 A.java라는 클래스가 있다면 이를 또 구별해야 한다. 이런 경우라면 com.gabdol 뒤에 임의로 갑돌이네 회사가 알아서 패키지 이름을 만들면 된다. 두 개의 소프트웨어 이름이 sw1, sw2라고 하면 com.gabdol.sw1.A, com.gabdol.sw2.A 식으로 클래스 이름을 사용하는 것이다.

이렇게 패키지를 사용하게 되면 이름 충돌의 문제도 해결할 수 있을 뿐만 아니라, 클래스를 분류하기도 쉽다. 예를 들어, 갑돌이네 회사에서 고객에 관련된 클래스들의 패키지 이름을 com.gabdol.client로 하고, 상품에 관련된 클래스들의 패키지 이름을 com.gabdol.product로 정하면 클래스들의 성격을 패키지 이름만 보고도 쉽게 파악할 수 있는 것이다.

클래스의 위치
이제, 갑돌이가 만드는 클래스의 이름이 com.gabdol.sw1.A로 정해졌다고 하자. 그렇다면 이 클래스는 어디에 위치해야 할까? com.gabdol.sw2.A와 같은 폴더에 존재하면 안 되므로, 패키지 이름에 따라 클래스의 위치가 유일하게 구별될 수 있어야 한다. 갑돌이는 자신의 클래스르 모두 C:\myClass라는 폴더에 두고 있으므로, com.gabdol.sw1.A 클래스는 C:\myClass\com\gabdol\sw1 폴더에 두고, com.gabdol.sw2.A 클래스는 C:\myClass\com\gabdol\sw2 폴더에 두면 두 클래스가 충돌하지 않을 것이다. 이렇게 하면, 소스 파일과 컴파일된 클래스 파일이 다음처럼 위치하게 된다.

C:\myClass\com\gabdol\sw1\A.java
C:\myClass\com\gabdol\sw1\A.class
C:\myClass\com\gabdol\sw2\A.java
C:\myClass\com\gabdol\sw2\A.class


이제, 패키지의 이름에 따른 클래스의 위치에 대해서 감이 오는가?

패키지 선언과 임포트
com.gabdol.sw1.A 클래스의 패키지는 com.gabdol.sw1이고 com.gabdol.sw2.A 클래스의 패키지는 com.gabdol.sw2이다. 이 정보는 당연히 두 소스 코드 내에 들어가야 한다. 방법은 간단하다. C:\myClass\com\gabdol\sw1\A.java 코드의 첫머리에 다음의 한 줄만 쓰면 된다.


package com.gabdol.sw1;


여기서, com.gabdol.sw1.A 클래스가 com.gabdol.sw2 패키지에 들어있는 클래스들을 사용하고 싶다고 하자. 어떻게 해야 할까? 방법은 두 가지이다.

첫번째는 클래스의 이름을 완전히 써 주는 것이다. 다음처럼 말이다.


package com.gabdol.sw1;
...
com.gabdol.sw2.B b = new com.gabdol.sw2.B();
...


이렇게 하면 클래스 B가 com.gabdol.sw2 패키지 내에 있는 것이 드러나므로 컴파일 시에 문제가 없다.

두번째는 패키지를 임포트(import)하는 것이다. 다음처럼 하면 된다.


package com.gabdol.sw1;
import com.gabdol.sw2.*;
...
B b = new B();
...


위의 코드의 import com.gabdol.sw2.*; 부분은 com.gabdol.sw1.A 클래스가 com.gabdol.sw2 패키지 내의 클래스들을 사용하겠다는 뜻이다. 이렇게 하면 자바 컴파일러가 B b = new B(); 부분을 컴파일하면서 B라는 클래스를 com.gabdol.sw1.A가 속해있는 com.gabdol.sw1 패키지와 임포트한 com.gabdol.sw2 패키지 내에서 찾게 된다. 만일, com.gabdol.sw1과 com.gabdol.sw2 패키지에 모두 B라는 이름의 클래스가 있다면 당연히 컴파일러는 어떤 것을 써야할지 모르므로 에러를 낸다. 이 경우에는 다음처럼 하는 수밖에 없다.


package com.gabdol.sw1;
import com.gabdol.sw2.*;
...
com.gabdol.sw1.B b1 = new com.gabdol.sw1.B();
com.gabdol.sw2.B b2 = new com.gabdol.sw2.B();
...


import com.gabdol.sw1.*과 같이 *를 사용하면 com.gabdol.sw1 패키지 내의 모든 클래스를 사용하겠다는 뜻이고, com.gabdol.sw1.B 클래스만 사용한다면 import com.gabdol.sw1.B라고 명시하면 된다.

클래스패스
이제, 갑돌이는 C:\myClass\com\gabdol\sw1\A.java 파일을 컴파일하려 한다. 갑돌이는 C:\myClass\com\gabdol\sw1\ 폴더로 이동해서 다음처럼 할 것이다.

javac A.java


결과는 당연히 클래스 B를 찾을 수 없다는 에러 메시지이다. com.gabdol.sw1.B 클래스가 컴파일된 바이트코드인 B.class가 도대체 어디에 있는지 자바 컴파일러로서는 알 길이 없기 때문이다. 이 때 필요한 것이 클래스패스이다. 갑돌이가 다음처럼 하면 컴파일이 성공적으로 이루어진다.

javac -classpath C:\myClass A.java


여기에 "-classpath C:\myClass" 부분은 자바 컴파일러에게 C:\myClass폴더를 기준으로 패키지를 찾으라는 뜻이다. 즉, com.gabdol.sw1.B 클래스는 C:\myClass 폴더를 시작으로 C:\myClass\com\gabdol\sw1 폴더에서 찾고, com.gabdol.sw2.B 클래스는 C:\myClass\com\gabdol\sw2 폴더에서 찾는 것이다.

그런데, 갑돌이는 돌쇠에게 건네 받은 클래스들을 C:\otherClass 라는 폴더에 저장하고 있었는데, 이 중에 일부 클래스를 A.java에서 사용할 일이 생겼다. 돌쇠가 건네 준 클래스는 com.dolsse.ddol 이라는 패키지에 포함되어 있고, 이 클래스들은 C:\otherClass\pr\com\dolsse\ddol 폴더에 있다면, 돌쇠가 준 클래스들은 C:\otherClass\pr 폴더를 시작으로 찾아야 한다. 따라서, 돌쇠의 클래스를 사용하는 A.java 파일을 컴파일하기 위해서는 다음처럼 해야 한다.

javac -classpath "C:\myClass;C:\otherClass\pr" A.java


이렇게 하면 C:\myClass 폴더에 저장되어 있는 com.gabdol.sw1.A, com.gabdol.sw2.B 클래스와 C:\otherClass\pr 폴더에 저장되어 있는 com.dolsse.ddol.* 클래스들을 자바 컴파일러가 제대로 찾을 수 있게 되는 것이다.

A.java를 컴파일해서 얻어진 클래스를 직접 실행하려면 자바 가상 머신을 구동해야 하는데, 이 때에서 당연히 A.class가 사용하는 다른 클래스를 자바 가상 머신이 찾을 수 있어야 한다. 따라서, 역시 컴파일할 때와 마찬가지로 클래스패스가 필요하다. A.class를 실행하려면 다음처럼 해야 한다.

java -classpath "C:\myClass;C:\otherClass\pr" com.gabdol.sw1.A


실행할 때에는 실행하고자 하는 클래스의 패키지 이름까지 명시해야 한다. 왜냐하면, 자바 가상 머신이 클래스를 실행할 때에는 지정된 이름이 패키지 이름을 포함한 것으로 생각하기 때문이다. 만일, 다음처럼 한다면,

java -classpath "C:\myClass;C:\otherClass\pr" A


자바 가상 머신은 C:\myClass\A.class 혹은 C:\otherClass\pr\A.class를 찾으려고 할 것이다.

클래스패스란 여러 폴더에 산재한 클래스들의 위치를 지정해서 패키지에 따라 클래스를 제대로 찾을 수 있게 해 주는 값이다.

환경 변수
매번, 컴파일할 때와 실행할 때에 classpath 옵션에 클래스패스를 명시하는 것을 불편하다. 한 번의 설정으로 이런 문제를 해결하기 위해서 환경 변수라는 것을 사용한다. 많은 독자들이 역시 환경 변수가 무엇인지, 어떻게 설정하는지 모르는 경우가 많으므로 여기서 잘 정리해 보겠다.

환경 변수는 말 그래로 변수에 어떤 값을 저장시키되 이를 환경에 저장하는 것이다. 환경에 저장한다는 말은 그 환경 내의 모든 프로그램이 그 변수의 값을 알 수 있게 된다는 뜻이다. 여러분이 윈도우 95/98/Me의 도스창 혹은 윈도우 NT/2000의 명령창을 실행시키면, 그 명령창 내에서 각종 프로그램을 구동할 수가 있는데, 이 때, 그 명령창의 환경에 변수 값을 설정하면 그 명령창 내에서 구동되는 프로그램들은 환경 변수 값을 얻을 수가 있게 된다.

명령창 내에서 환경 변수를 설정하는 방법은 간단하다.

C:\> SET 변수이름=값


혹은

C:\> SET 변수이름="값"


처럼 하면 된다. 여러분의 명령창 또는 도스창을 띄워서 다음처럼 해 보자.

C:\> SET myname="Hong Gil Dong"


이렇게 하면 환경 변수 myname에는 "Hong Gil Dong"이 설정된다. 제대로 설정이 되었는지 확인해 보기 위해서는 다음처럼 하면 된다.

C:\> echo %myname%
"Hong Gil Dong"


첫 번째 줄은 환경 변수 myname의 값을 출력하라는 명령이고, 두 번째 줄은 그 결과가 나온 것이다.

환경 변수는 메모리가 허락하는 양만큼 설정할 수 있다. 즉, 다음처럼 복수 개의 환경 변수를 설정할 수 있다는 말이다.

C:\> SET myname="Hong Gil Dong"

C:\> SET yourname="Kim Gap Soon"


자, 이번에는 이 명령창을 종료하고 다른 명령창을 띄워 보자. 그리고, 다음처럼 myname 환경 변수의 값을 출력해 보자.

C:\> echo %myname%
%myname%


두 번째 줄과 같은 결과가 나온다. 조금 전에 설정했던 값을 온데간데 없다. 왜 그럴까? 이유는 간단하다. 환경 변수는 그 명령창 내에서만 존재하기 때문이다. myname 변수를 설정한 명령창을 종료했기 때문에, 이와 동시에 myname 환경 변수가 사라진 것이다. 또, myname 변수를 설정한 명령창을 종료하지 않았다고 해도, 다른 명령창에서는 myname 변수 값을 공유하지 않는다. 오로지, 변수를 설정한 그 명령창 내에서만 그 변수는 의미가 있게 되는 것이다.

이렇게 환경 변수가 명령창 내에서만 의미가 있기 때문에, 온갖 프로그램에서 공유하기 위해서는 명령창에서 환경 변수를 설정하는 방법 외에 다른 방법을 사용해야 한다. 윈도우 95/98/Me라면 autoexec.bat 파일을 사용하고, 윈도우 NT/2000이라면 글로벌 환경 변수를 설정하는 별도의 방법이 존재한다.

우선, 윈도우 NT/2000이라면 다음처럼 한다.

1. 바탕화면의 "내 컴퓨터"를 오른쪽 클릭한다.

2. "고급" 메뉴를 택한다.

3. 가운데 "환경 변수" 메뉴를 택한다.

4. 두 창이 나오는데 위 쪽은 특정 로그인 사용자에 대한 환경 변수를 설정하는 것이고, 아래 쪽은 모든 사용자에게 적용되는 환경 변수를 설정하는 것이다. 관리자(Administrator) 권한을 갖고 있다면 아래 시스템 변수의 값을 설정할 수 있다. 상황에 맞게 선택하면 된다.

5. 버튼이 "새로 만들기", "편집", "삭제"가 있는데, 새로운 환경 변수를 만드는 경우에는 "새로 만들기"를 클릭하고, 기존 변수 값을 수정하고자 한다면 "편집"을 누른다. "삭제"는 물론 변수를 아예 없애는 경우에 클릭한다.

6. "새로 만들기"나 "편집"을 클릭하면 변수 이름과 값을 설정하게 되어 있는데 여기에 원하는 이름과 값을 입력하면 된다.


윈도우 95/98/Me라면, autoexec.bat 파일을 편집기로 열어서 "set 변수이름=값"을 아무데나 추가하면 된다.

자, 이제는 글로벌 환경 변수에 클래스패스 변수를 설정해 보자.

윈도우 NT/2000이라면 위의 단계를 차례로 실행한 후에, 이미 CLASSPATH 혹은 classpath 변수가 있다면 이를 편집하고, 없다면 새로 만들기를 하면 된다. 지금까지 예로 든 대로라면 다음의 값을 입력하면 된다.

C:\myClass;C:\otherClass\pr

<김상욱 주: 이렇게만 하면 한 디렉토리에서 방금 만들어진 클래스파일 즉 현재 디렉토리의 클래스파일을 찾지 못하기 때문에 현재 디렉토리를 나타내는 . 을 추가한다.>

<즉, .\C:\myClass;C:\otherClass\pr 이렇게 입력하여야 합니다.>


윈도우 95/98/Me라면 autoexec.bat 파일을 열어서, 다음의 한 줄을 추가한다.

set CLASSPATH="C:\myClass;C:\otherClass\pr"

<김상욱 주: 마찬가지 이유로 set CLASSPATH=".;C:\myClass;C:\otherClass\pr" 로 입력되어야 합니다.>


그렇다면, 자바 컴파일러와 자바 가상 머신은 이렇게 설정한 환경 변수와는 어떤 관계가 있을까? 자바 컴파일러와 자바 가상 머신은 -classpath 옵션을 지정하지 않으면 환경 변수 CLASSPATH 혹은 classpath의 값을 시스템으로부터 얻어서 이를 클래스패스로 사용한다. 클래스패스의 값을 환경 변수로부터 얻을 수 있도록 애초부터 만들어진 것이다.

jar 파일과 클래스패스
jar 파일은 클래스들을 묶어 놓은 것이다. 즉, 갑돌이는 자신이 만든 com.gabdol 이하의 모든 클래스를 하나의 파일인 gabdol.jar 파일로 묶을 수가 있다. 이렇게, gabdol.jar 파일을 C:\gg\cc 폴더 아래에 두었다면 이 압축 파일 내의 클래스를 역시 자바 컴파일러와 자바 가상 머신이 찾을 수 있도록 해야 한다. 이 때에는 파일 이름까지 포함해서 클래스패스에 추가해야 한다. 다음처럼 말이다.

set CLASSPATH=C:\gg\cc\gabdol.jar;C:\myClass;C:\otherClass\pr


마치며


지금까지 자바 프로그램의 가장 기초라고 할 수 있는 클래스패스에 대해서 알아 보았다. 필자는 이 글로 더 이상의 클래스패스에 대한 질문이 사라졌으면 하는 바램이다. 독자 여러분이 클래스패스를 고민하는 것도 시간 낭비이고, 저자가 이에 대해서 일일이 답변해 주는 것도 시간 낭비라고 생각된다. 만일, 독자 여러분이 클래스를 찾지 못한다는 에러를 만난다면 100% 클래스패스 설정 잘못이므로, 이 글을 잘 읽어서 근본적으로 클래스패스에 대해서 이해한 후에 문제를 해결하는 노력을 기울이도록 하자.

'자바 > 자바팁' 카테고리의 다른 글

objectinputstream 생성시 주의사항  (0) 2010.10.28
자바 날짜 관련 함수모음  (0) 2010.10.28
Borderlayout 기본설명  (0) 2010.10.21
에코 클라이언트 과정  (0) 2010.10.21
JDialog 고급활용  (0) 2010.10.18
import java.awt.*;
import javax.swing.*;

public class ComponetSize
{
JFrame jf = null;

public ComponetSize(JFrame jf)
{
this.jf = jf;
}
public int[] getCenterLocation()
{
int[] pos = new int[2];

Dimension dimen = Toolkit.getDefaultToolkit().getScreenSize();
Dimension dimen1 = jf.getSize();
pos[0] = (int) (dimen.getWidth() / 2 - dimen1.getWidth()/2);
pos[1] = (int) (dimen.getHeight() / 2 -dimen1.getHeight()/2);
return pos;
}
}

'자바 > 추천소스모음' 카테고리의 다른 글

안드로이드 조그버튼(휠) 예제소스  (0) 2017.11.07
자바 스노우크래프트 소스  (0) 2010.11.26
자바메모장추천소스  (0) 2010.10.20


import java.net.*;
import java.io.*;
import java.util.*;
import java.net.*;

public class ChatClientByConsole
{

 static int port = 0;
 static String host = "";
 public ChatClientByConsole(String host,int port)
 {
  this.port = port;
  this.host = host;
  

 }
 public static void main(String[] args)
 {
  new ChatClientByConsole("127.0.0.1",10001);

  Socket sock = null;;
  PrintWriter pw=null;
  BufferedReader br=null;
  BufferedReader br2=null;
  InputStream in;
  OutputStream out;

  try
  {
   sock = new Socket(host,port);
   br = new BufferedReader(new InputStreamReader(System.in));
   in = sock.getInputStream();
   out = sock.getOutputStream();
   pw = new PrintWriter(new OutputStreamWriter(out));
   br2 = new BufferedReader(new InputStreamReader(in));
   
   pw.println(args[0]);
   pw.flush();
   
   String line= null;
   
   //입력쓰레드 생성
   InputThread it = new InputThread(sock,br2);
   it.start();

   while((line=br.readLine())!=null)
   {
    //System.out.println(args[0]+":"+line);
    pw.println(line);
    pw.flush();
   }

   
  }
  catch (SocketException sqe)
  {
   System.out.println("서버와 연결이 안됨");
  }
  catch(Exception ex)
  {
   ex.printStackTrace();
  }
  finally
  {
   try
   {
    if(pw!=null)
     pw.close(); 
    if(br2!=null)
     br2.close(); 
    //if(br2!=null)
    // br2.close();
    if(sock!=null)
     sock.close(); 
   }
   catch (Exception ex)
   {
   }
   
  }
  //키보드로 부터 입력받는다.
  //입력받은 걸 inputStream으로 바꾼다.
  //그런다음

 }
}

class InputThread extends Thread
{
 Socket sock = null;
 BufferedReader br = null;
 PrintWriter pw = null;
 InputStream in = null;
 OutputStream out = null;

 public InputThread(Socket sock,BufferedReader br)
 {
  this.sock = sock;
  this.br = br;
 }

 public void run()
 {
  try
  {
   in=sock.getInputStream();
   out=sock.getOutputStream();

   //br = new BufferedReader(new InputStreamReader(in));
   //pw = new PrintWriter(new OutputStreamWriter(out));
   
   String line = null;

   while( (line=br.readLine()) != null)
   {
    System.out.println(line);
    
   }
  }
  catch (Exception ex)
  {
   ex.printStackTrace();
  }
  finally
  {
   try
   {
    if(pw!=null)
     pw.close(); 
    if(br!=null)
     br.close();
    //if(br2!=null)
    // br2.close();
    if(sock!=null)
     sock.close(); 
   }
   catch (Exception ex)
   {
   }
   
  }
  
 }
}

'자바 > 채팅방' 카테고리의 다른 글

swing으로 만든 멀티채팅소스  (0) 2010.10.27
멀티서버네번째소스  (0) 2010.10.26
자바 멀티서버 기본소스  (0) 2010.10.24
채팅방클라이언트  (0) 2010.10.22
채팅방 Client UI  (0) 2010.10.21


import java.net.*;
import java.io.*;
import java.util.*;


public class MultiChatServer
{

 public static void main(String[] args)
 {
  try
  {
   ServerSocket serverSoc = new ServerSocket(10001);
   System.out.println("접속을 기다립니다.");
   HashMap hm = new HashMap();
   while(true)
   {
    Socket sock = serverSoc.accept();
    ChatThread chatthread = new ChatThread(sock,hm);
    chatthread.start();
   }
  }
  catch (Exception ex)
  {
   System.out.println(ex);
  }
  System.out.println("Hello World!");
 }
}

class ChatThread extends Thread
{
 private Socket socket;
 private String id;
 private BufferedReader br;
 private PrintWriter pw;
 private HashMap hm;
 private boolean initFlag = false;
 public ChatThread(Socket socket,HashMap hm)
 {
  this.socket = socket;
  this.hm = hm;
 
  try
  {
   pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
   br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   //System.out.println("11111");
   id=br.readLine();
   //System.out.println("22222");
   broadcast(id +"님이 접속했습니다.");
   System.out.println("접속한 사용자의 아이디는 "+ id +"입니다.");
   
   synchronized(hm)
   {
    hm.put(this.id,pw);
   }
   
   initFlag = true;
  }
  catch (Exception ex)
  {
   //System.out.println("111111111");
   ex.printStackTrace();
  }
 }
 public void run()
 {
  try
  {
   String line = null;
   System.out.println("1111111111");
   while((line = br.readLine()) != null)
   {
    broadcast(id + ":" +line);
   }
   System.out.println("22222222222");
  }
  catch (Exception ex)
  {
   //System.out.println("2222222");
   ex.printStackTrace();
  }
  finally
  {
   synchronized(hm)
   {
    hm.remove(id);
   }
   try
   {
    if(socket!=null)
     socket.close(); 
   }
   catch (Exception ex)
   {
   }
  }

 }
 public void broadcast(String msg)
 {
  synchronized(hm)
  {
   Collection col = hm.values();
   Iterator iter = col.iterator();
   while(iter.hasNext())
   {
    PrintWriter pw = (PrintWriter)iter.next();
    pw.println(msg);
    pw.flush();
   }
  }
 }
}

'자바 > 채팅방' 카테고리의 다른 글

swing으로 만든 멀티채팅소스  (0) 2010.10.27
멀티서버네번째소스  (0) 2010.10.26
자바 멀티채팅클라이언트 기본소스  (0) 2010.10.24
채팅방클라이언트  (0) 2010.10.22
채팅방 Client UI  (0) 2010.10.21


import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;

/*
1.Socket 생성자에 서버의IP와 서버의 동작 포트값을(10001)을 인자로 넣어 생성한다.
소켓이 성공적으로 생성되었다면 서버와 접속이 성공적으로 되었다는 것을 의미한다.
2.생선된 socket으로부터 InputStream 과 OutputStream을 구한다.
3.InputStream 은BufferReader 형식으로 변환하고 OutputStream은 PrintWriter 형식으로 변환한다.
4.키보드로 부터 한줄 씩 입력닫는 BufferReader객체를 생성한다.
5.키보드로부터 한줄을 입력받아 PrintWriter에 있는 Printl()메소드를 이용해서 서버에게 전송한다.
6.서버가 다시 봔환하는 문자열을 BufferReader에 있는 readLine()메소드를 이용해서 읽어 들인다.
읽어들인 문자열은 화면에 출력한다.
7.4,5,6을 키보드로부터 quit문자열을 입력받을 때까지 반복한다.
8.키보드로부터 quit문자열이 입력되면 IO객체와 소켓의 close()메소드를 호출한다.
*/
public class ChattingClient 
{
public static void main(String[] args) 
{
CreateChattingUI ccu =new CreateChattingUI();

ccu.setSize(500,500);
ccu.pack();
ccu.setVisible(true);
}
}

//채팅방UI 만드는 클래스
class CreateChattingUI extends JFrame
{
JPanel jp,bottom_jp;
BorderLayout bl;
static JTextArea top_jta;
JTextArea member_jta;
static JTextField username_jtf,msg_jtf;
// JComponent msg_jtf;
JButton msgSend_jb;
static Socket soc;

public CreateChattingUI()
{
super("자바로 만든 채팅방");
//소켓접속
try
{
soc = new Socket("127.0.0.1",10001);
//InputStream in = new ByteArrayInputStream();

}
catch (ConnectException ce)
{
System.out.println("호스트와 연결안됨");
}
catch(Exception e)
{
e.printStackTrace();
}

this.setLayout(new BorderLayout());

jp = new JPanel();
bl = new BorderLayout(2,2);
top_jta = new JTextArea();//왼쪽위 텍스트창
member_jta = new JTextArea(2,12);
username_jtf = new JTextField("대화명",10);
msg_jtf = new JTextField("메세지를 입력하시길 바랍니다.",42);
bottom_jp = new JPanel(new FlowLayout());
msgSend_jb = new JButton("메세지보내기");

top_jta.setEditable(false);
top_jta.setFont(new Font("굴림",Font.BOLD,12));
//System.out.println(msg_jtf.isRequestFocusEnable());

/*
textarea에 스크롤 붙이기
*/
JScrollPane scrollPane = new JScrollPane();
scrollPane.setPreferredSize(new Dimension(600,300));
scrollPane.setBorder(BorderFactory.createTitledBorder(""));
scrollPane.getViewport().add(top_jta, null);
jp.setLayout(bl);
jp.add(scrollPane,BorderLayout.WEST);

jp.add(member_jta,BorderLayout.EAST);
//msg_jtf.setSize(350,30);
bottom_jp.add(username_jtf);
bottom_jp.add(msg_jtf);
bottom_jp.add(msgSend_jb);
this.add(jp,BorderLayout.NORTH);
this.add(bottom_jp,BorderLayout.SOUTH);
//msg_jtf.addFocusListener((new EventManager()).focusGained(new FocusEvent()));
/*
텍스트 필드 클릭시 초기화 이벤트
*/
msg_jtf.addFocusListener(new FocusAdapter()
{
public void focusGained(FocusEvent fe)
{
JTextField tepJtf = (JTextField)fe.getSource();
tepJtf.setText("");
//System.out.println(((JTextField)fe.getSource()).getText());
}
});

username_jtf.addFocusListener(new FocusAdapter()
{
public void focusGained(FocusEvent fe)
{
JTextField tepJtf = (JTextField)fe.getSource();
tepJtf.setText("");
//System.out.println(((JTextField)fe.getSource()).getText());
}
});
/*
1.내용입력하고 보낼시 서버에 전달한다.2번
2.자기 메세지는 바로 텍스트에어리어창에 첫줄에 기록한다.1번
3.그리고 다른 클라이언트 메세지 입력시 창에 뜨게 한다.3번
*/
ActionListener al = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
//JTextField jtd = (JTextField)ae.getSource();
String username = username_jtf.getText();
String msg = msg_jtf.getText();
if(username.equals("") || username.equals("대화명"))
{
username = "손님";
}

//username = (Font.getFont(username,new Font("바탕",Font.ITALIC,12))).getFontName();
top_jta.append(username+" : "+msg+"\n");
//top_jta.setLineWrap(true);
msg_jtf.setText("");

sendMsg(username,msg,soc);
}
};
msg_jtf.addActionListener(al);
msgSend_jb.addActionListener(al);
}
static void sendMsg(String username,String msg,Socket soc)
{
InputStream in = null;
OutputStream out = null;
OutputStream out2 = null;
PrintWriter pw = null;
BufferedReader br = null;
OutputStreamWriter osw = null;
BufferedReader br2 = null;

try
{
//in = new ByteArrayInputStream(msg.getBytes());
//in = 
//System.out.println("11111111111111111");
if(soc!=null)
{
//System.out.println("2222222222222");
in = soc.getInputStream();
out = soc.getOutputStream();
// out2 = new ByteArrayOutputStream();
// out2.write(msg.getBytes());
//InputStream in2 = new InputStream();
//br2 = new BufferedReader(new InputStreamReader(in));

//System.out.println(msg.getBytes());
br = new BufferedReader(new InputStreamReader(in));
pw = new PrintWriter(new OutputStreamWriter(out));
pw.println(msg.trim());
pw.flush();
String line=null;
//System.out.println("11111111");
//System.out.println("줄 : "+out2.readLine());
//System.out.println(out2.readLine());
while((line=br.readLine())!=null)
{
//pw.println(line);
//pw.flush();
//String echo = br.readLine();
System.out.println(line);
//System.out.println(msg);
//System.out.println("서버 : "+line);
}
//pw.flush();
}

}
catch (Exception ioe)
{
ioe.printStackTrace();
}
finally
{

try
{
if(br!=null)
br.close();
if(soc!=null)
{
soc.close();
}
}                                                                                                                                                        
catch (IOException ioe)
{

}
}
}
}

'자바 > 채팅방' 카테고리의 다른 글

swing으로 만든 멀티채팅소스  (0) 2010.10.27
멀티서버네번째소스  (0) 2010.10.26
자바 멀티채팅클라이언트 기본소스  (0) 2010.10.24
자바 멀티서버 기본소스  (0) 2010.10.24
채팅방 Client UI  (0) 2010.10.21
import javax.swing.*;
import java.awt.*;

public class ChattingClient 
{
public static void main(String[] args) 
{
CreateChattingUI ccu =new CreateChattingUI();

ccu.setSize(500,500);
ccu.pack();
ccu.setVisible(true);
}
}

//채팅방UI 만드는 클래스
class CreateChattingUI extends JFrame
{
JPanel jp,bottom_jp;
BorderLayout bl;
JTextArea top_jta,member_jta;
JTextField username_jtf,msg_jtf;
JButton msgSend_jb;
public CreateChattingUI()
{
super("자바로 만든 채팅방");
this.setLayout(new BorderLayout());

jp = new JPanel();
bl = new BorderLayout(2,2);
top_jta = new JTextArea();//왼쪽위 텍스트창
member_jta = new JTextArea(2,12);
username_jtf = new JTextField("대화명",10);
msg_jtf = new JTextField("메세지를 입력하시길 바랍니다.",42);
bottom_jp = new JPanel(new FlowLayout());
msgSend_jb = new JButton("메세지보내기");

/*
textarea에 스크롤 붙이기
*/
JScrollPane scrollPane = new JScrollPane();
scrollPane.setPreferredSize(new Dimension(600,300));
scrollPane.setBorder(BorderFactory.createTitledBorder(""));
scrollPane.getViewport().add(top_jta, null);
jp.setLayout(bl);
jp.add(scrollPane,BorderLayout.WEST);

jp.add(member_jta,BorderLayout.EAST);
//msg_jtf.setSize(350,30);
bottom_jp.add(username_jtf);
bottom_jp.add(msg_jtf);
bottom_jp.add(msgSend_jb);
this.add(jp,BorderLayout.NORTH);
this.add(bottom_jp,BorderLayout.SOUTH);

}


}

'자바 > 채팅방' 카테고리의 다른 글

swing으로 만든 멀티채팅소스  (0) 2010.10.27
멀티서버네번째소스  (0) 2010.10.26
자바 멀티채팅클라이언트 기본소스  (0) 2010.10.24
자바 멀티서버 기본소스  (0) 2010.10.24
채팅방클라이언트  (0) 2010.10.22

GUI 를 이루는 기본 요소 네 가지는 각각 컴포넌트, 컨테이너, 레이아웃 관리자, 그리고 그래픽스라는 것을 처음에 언급한 바 있다. 우리는 이미 컴포넌트와 컨테이너에 대해 공부하였으며, 이제부터는 레이아웃 관리자 (Layout Manager) 에 대해 공부하도록 하자. 레이아웃(layout)이란 컴포넌트들을 컨테이너 상에 어떻게 배치할 것인지를 결정하는 것을 말한다.

많은 레이아웃 관리자가 있지만, 대표적인 것들로 다음의 다섯 가지를 들 수 있다.

  • BorderLayout - 동, 서, 남, 북, 중앙으로 배치
  • FlowLayout - 위에서 아래로, 왼쪽에서 오른쪽으로 배치
  • GridLayout - 동일 크기를 갖는 격자에 배치
  • GridBagLayout - 다른 크기를 가질 수 있는 격자에 배치
  • BoxLayout - 수평 또는 수직 방향으로 배치

우리는 이미 BorderLayout 과 FlowLayout 에 대해 어느 정도 공부한 바가 있다. BorderLayout 은 JFrame 에서, FlowLayout 은 JPanel 에서 각각 기본적으로 사용되었던 것을 기억할 것이다.

이미 배운 두 레이아웃을 간단히 정리해보고, GridLayout, GridBagLayout, 그리고 BoxLayout 에 대해 공부해보자. 




BorderLayout

BorderLayout은 컴포넌트를 동, 서, 남, 북, 중앙에 각각 배치하며, 각각의 위치에는 최대 한 개의 컴포넌트만 둘 수 있다. 만일 한 위치에 다수 개의 컴포넌트를 두려면 앞에서 배운 것처럼 해당 위치에 JPanel 을 두고, JPanel 상에 컴포넌트들을 배치하는 우회적 방법을 사용하면 된다.

컴포넌트들을 컨테이너 상에 위치하게 하려면 add() 메소드를 사용한다.

  • void add(Component c, int index)

처음 파라미터인 Component 는 우리가 여태까지 배운 라벨, 버튼, 텍스트필드 등 어느 컴포넌트든지 올 수 있고, 두번째 파라미터인 int 에는 EAST, WEST, SOUTH, NORTH, CENTER가 올 수 있다. 이 값들은 BorderLayout 에 포함되어 있으므로 BorderLayout.EAST 등과 같이 표기해야 한다.

BorderLayout 은 JFrame 에서 기본적으로 사용된다. 만일 JPanel 에서 BorderLayout 을 사용하려고 한다면 다음과 같이 setLayout() 메소드를 호출해야 한다.

BorderLayout layout = new BorderLayout();
setLayout(layout);

즉 BorderLayout 클래스의 인스턴스를 생성한 다음, 그것을 setLayout() 메소드의 파라미터로 넘겨주면 되는 것이다. setLayout() 은 Container 클래스가 가지고 있는 메소드이며, 따라서 그것의 하위 클래스인 JFrame, JPanel 등 임의의 컨테이너에서도 상속성에 따라 사용 가능하다.

다음 예제는 JPanel 상에 BorderLayout 을 설정하고, 동, 서, 남, 북, 중앙에 각각 "East", "West", "South", "North", "Center" 라는 라벨을 배치하는 것이다. 4번째 강의록, 즉 JLabel 에 대해 배울 때 이미 작성했던 프로그램이며, 단지 JFrame 대신 JPanel 상에 라벨을 배치했다는 점이 다르다.

import javax.swing.*;
import java.awt.*;

public class Test {
 public static void main(String[] args) {
	MyFrame f = new MyFrame();
 }
}

class MyFrame extends JFrame {
 MyFrame() {
	setTitle("My Frame");
	setSize(300, 200);
	makeUI();
	setVisible(true);
 }
 private void makeUI() {
	/* create a panel and set the layout */
	JPanel p = new JPanel();
	p.setLayout(new BorderLayout());

	JLabel le, lw, ls, ln, lc;
	le = new JLabel("East");
	lw = new JLabel("West");
	ls = new JLabel("South");
	ln = new JLabel("North");
	lc = new JLabel("Center");

	le.setHorizontalAlignment(JLabel.CENTER);
	lw.setHorizontalAlignment(JLabel.CENTER);
	ls.setHorizontalAlignment(JLabel.CENTER);
	ln.setHorizontalAlignment(JLabel.CENTER);
	lc.setHorizontalAlignment(JLabel.CENTER);

	p.add(le, BorderLayout.EAST);
	p.add(lw, BorderLayout.WEST);
	p.add(ls, BorderLayout.SOUTH);
	p.add(ln, BorderLayout.NORTH);
	p.add(lc, BorderLayout.CENTER);

	/* attach panel to the frame */
	add(p, BorderLayout.CENTER);
 }
}


이 프로그램의 실행 결과는 아래와 같으며 4번째 강의록에서 소개한 결과와 동일함을 알 수 있다. 즉 우리는 기본적으로 FlowLayout 를 따르는 JPanel 에 대해 의도적으로 BorderLayout 을 사용하게 한 것이다.

 

'자바 > 자바팁' 카테고리의 다른 글

자바 날짜 관련 함수모음  (0) 2010.10.28
클래스패스 설정  (0) 2010.10.25
에코 클라이언트 과정  (0) 2010.10.21
JDialog 고급활용  (0) 2010.10.18
JFrame 관련 팁  (0) 2010.10.18
1.Socket 생성자에 서버의IP와 서버의 동작 포트값을(10001)을 인자로 넣어 생성한다.소켓이 성공적으로 생성되었다면 서버와 접속이 성공적으로 되었다는 것을 의미한다.
2.생선된 socket으로부터 InputStream 과 OutputStream을 구한다.
3.InputStream 은BufferReader 형식으로 변환하고 OutputStream은 PrintWriter 형식으로 변환한다.
4.키보드로 부터 한줄 씩 입력닫는 BufferReader객체를 생성한다.
5.키보드로부터 한줄을 입력받아 PrintWriter에 있는 Printl()메소드를 이용해서 서버에게 전송한다.
6.서버가 다시 봔환하는 문자열을 BufferReader에 있는 readLine()메소드를 이용해서 읽어 들인다.
읽어들인 문자열은 화면에 출력한다.
7.4,5,6을 키보드로부터 quit문자열을 입력받을 때까지 반복한다.
8.키보드로부터 quit문자열이 입력되면 IO객체와 소켓의 close()메소드를 호출한다.


'자바 > 자바팁' 카테고리의 다른 글

클래스패스 설정  (0) 2010.10.25
Borderlayout 기본설명  (0) 2010.10.21
JDialog 고급활용  (0) 2010.10.18
JFrame 관련 팁  (0) 2010.10.18
action event 를 쓸때 컴파일시 inner class 에러 나는 경우  (0) 2010.10.18

에코서버
1.1001번 포트에서 동작하는 ServerSocket 을 생성한다.
2.ServerSocket의 accept() 메소드를 실행해서 클라이언트의 접속을 대기한다.
3.클라이언트가 접속할 경우 accpt()메소드는 Socket 객채를 반환한다.
4.반환받은 socket으로부터 InputStream과 OutputStream을 구한다.
5.InputStream은 BufferReader형식으로 변환하고 OutputStream은 PrintWriter 형식으로 변환한다.
6.BufferedReader의 readLine()메소드를 이용해서 클라이언트가 보내는 문자열 한 줄을 읽어 들인다.
7.  6번에서 읽어들인 문자열을 PrintWriter에 있는 println()메소드를 이용해서 다시 클라이언트로 전송한다.
8. 6번,7번의 작업은 클라이언트가 접속을 종료할 때 까지 반복된다. 클라이언트가 접속을 종료하게 되면 BufferedReader 에 있는 readLine() 메소드는 null값을 반환하게 된다.
9.IO객체와 소켓의 close()메소드를 호출한다.


import java.net.*;
import java.io.*;

public class EchoServer
{
 try
 {
  ServerSocket server = new ServerSocket(10001);
  System.out.println("접속을 기다립니다");
  Socket sock = server.accept();
  InetAddress inetaddr = sock.getInetAddress();
  System.out.println(inetaddr.getHostAddress() + " 로부터 접속했습니다.");
  OutputStream out = sock.getOutputStream();
  InputStream in = sock.getInputStream();
  Print
 }
 catch ()
 {
 }
      
 

}

import java.io.*;
import java.beans.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.print.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.undo.*;
import javax.swing.border.*;

public class Jmemo extends JFrame implements ClipboardOwner,ActionListener,Printable,UndoableEditListener
{
   Container contentPane;
 private JTextArea ta = new JTextArea(); //글을쓸 텍스트에어리어
 private JMenuBar mb = new JMenuBar();//메뉴바
 private JMenu m1,m2,m3,m4;//메뉴
 private JMenuItem mi11,mi12,mi13,mi14,mi15,mi16,mi17
  ,mi21,mi22,mi23,mi24,mi25,mi26,mi27,mi28,mi29,mi2a,mi2b
  ,mi32
  ,mi41,mi42 ;//메뉴 아이템
 private JCheckBoxMenuItem mi31;
 
 String st="";
 File file;
 private JOptionPane jOptionPane;
 Object options[]={"예","아니오","취소"};
 int cnt;
 JViewport viewPort;
 JScrollPane scrollPane;
 
 UndoManager undoManager=new UndoManager();
  public Jmemo(String title)
  {
  super(title);
  
/*  
  try
  {//룩앤필 설정 : 윈도우(윈도우에서만 가능)
   UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
  }
  catch(Exception e)
  {
   System.err.println("자바 룩앤필 에러 :"+e.getMessage());
   JOptionPane.showMessageDialog(this,"Windows환경에서만 가능합니다."
    ,"자바 룩앤필 에러",JOptionPane.ERROR_MESSAGE);
  }
*/
  try
  {//룩앤필 설정 : 크로스
   UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
  }
  catch(Exception e)
  {
   System.err.println("자바 룩앤필 에러 :"+e.getMessage());
     JOptionPane.showMessageDialog(this,"설정하신 룩앤필이 존재하지 않습니다.","자바 룩앤필 에러",JOptionPane.ERROR_MESSAGE);
  }

  
  Image img=getToolkit().getImage("img/memo.gif");
  setIconImage(img);//윈도우 아이콘 변경
  addWindowListener(new WindowAdapter(){
                    public void windowClosing(WindowEvent we){
           System.exit(0);}});//윈도우 종료시 프로그램 종료   
  
  ta.getDocument().addUndoableEditListener(this);   
  contentPane = getContentPane();  
      scrollPane =new JScrollPane(ta);
      //scrollPane.add(ta);
      viewPort=scrollPane.getViewport();    
      viewPort.add(ta);     
  contentPane.add(scrollPane);//TextArea       
       
      
     
  
  this.setJMenuBar(mb);//메뉴바  
 ///////////////////////////////메뉴 구성////////////////////////////////////////////// 
  m1 = new JMenu("파일");  
  
  mi11 = new JMenuItem("새로만들기");
  mi12 = new JMenuItem("열기");
  mi13 = new JMenuItem("저장");
  mi14 = new JMenuItem("다른이름으로저장");
  mi15 = new JMenuItem("페이지설정");
  mi16 = new JMenuItem("인쇄");
  mi17 = new JMenuItem("끝내기");
  mi11.addActionListener(this);//액션리스너 등록
  mi12.addActionListener(this);
  mi13.addActionListener(this);
  mi14.addActionListener(this);
  mi15.addActionListener(this);
  mi16.addActionListener(this);
  mi17.addActionListener(this);
  
  mi11.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
  mi12.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
  mi13.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
  mi14.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.ALT_MASK));
  mi15.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, ActionEvent.ALT_MASK));
  mi16.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK));
  mi17.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
  
  mb.add(m1);  
  
  m1.add(mi11);
  m1.add(mi12);
  m1.add(mi13);
  m1.add(mi14);
  m1.addSeparator();
  m1.add(mi15);
  m1.add(mi16);
  m1.addSeparator();
  m1.add(mi17);
  
  m2 = new JMenu("편집");
  
  mi21 = new JMenuItem("실행취소");
  mi22 = new JMenuItem(new DefaultEditorKit.CutAction());
      mi22.setText("잘라내기");
      mi23 = new JMenuItem(new DefaultEditorKit.CopyAction());
      mi23.setText("복사");
  mi24 = new JMenuItem(new DefaultEditorKit.PasteAction());
      mi24.setText("붙여넣기");
  mi25 = new JMenuItem("삭제");
  mi26 = new JMenuItem("찾기");
  mi27 = new JMenuItem("다음찾기");
  mi28 = new JMenuItem("바꾸기");
  mi29 = new JMenuItem("이동");
  mi2a = new JMenuItem("모두선택");
  mi2b = new JMenuItem("시간날짜");
  
  mi21.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK));
  mi22.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
  mi23.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
  mi24.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK));
  //mi25.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE));
  mi26.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, ActionEvent.CTRL_MASK));
  //mi27.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,ActionEvent.META_MASK));
  mi28.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.CTRL_MASK));
  mi29.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, ActionEvent.CTRL_MASK));
  mi2a.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK));
  //mi2b.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,ActionEvent.META_MASK));
  
  mi21.addActionListener(this);
  mi22.addActionListener(this);
  mi23.addActionListener(this);
  mi24.addActionListener(this);
  mi25.addActionListener(this);
  mi26.addActionListener(this);
  mi27.addActionListener(this);
  mi28.addActionListener(this);
  mi29.addActionListener(this);
  mi2a.addActionListener(this);
  mi2b.addActionListener(this);
  
  mb.add(m2);
  
  m2.add(mi21);
  m2.addSeparator();
  m2.add(mi22);
  m2.add(mi23);
  m2.add(mi24);
  m2.add(mi25);
  m2.addSeparator();
  m2.add(mi26);
  m2.add(mi27);
  m2.add(mi28);
  m2.add(mi29);
  m2.addSeparator();
  m2.add(mi2a);
  m2.add(mi2b);
  
  m3 = new JMenu("서식");
  
  mi31 = new JCheckBoxMenuItem("자동줄바꿈");
  mi32 = new JMenuItem("글꼴");
  
  mi31.addActionListener(this);
  mi32.addActionListener(this);
  
  mb.add(m3);
  
  m3.add(mi31);
  m3.add(mi32);
  
  m4 = new JMenu("도움말");
  
  mi41 = new JMenuItem("도움말항목");
  mi42 = new JMenuItem("메모장정보");
  
  mi41.addActionListener(this);
  mi42.addActionListener(this);
  
  mb.add(m4);
  
  m4.add(mi41);
  m4.addSeparator();
  
  m4.add(mi42);  
      
  }
 
 public boolean keyDown(Event e,int key)
 {
  cnt++;
  System.out.println("SD");
  return false;
 }
 
 public void actionPerformed(ActionEvent ae)//메뉴 액션 처리
 {
  try{
   String gac=ae.getActionCommand();
   if(gac.equals("새로만들기"))
   {    
    File f=getFile();
    if(!("".equals(ta.getText()))&&f==null)  
    {
     jOptionPane = new JOptionPane();
     jOptionPane.showOptionDialog(this,getTitle().replaceAll("- 메모장","")+
      " 파일의 내용이 변경되 었습니다.\n 변경된 내용을 저장 하시겠습니까?",
      "메모장",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE,
        null, options,options[0]);
     if(jOptionPane.getValue().equals(options[0]))
       saveDocument(true);
     else
      ta.setText("");
     /*
     JOptionPane.showOptionDialog(this,getTitle().replaceAll("- 메모장","")+
     " 파일의 내용이 변경되 었습니다.\n 변경된 내용을 저장 하시겠습니까?",
            "메모장",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE,null, options,options[0]);
     */
    }   
    else if(cnt>0)
    {
     JOptionPane.showOptionDialog(this,getTitle().replaceAll("- 메모장","")+
     " 파일의 내용이 변경되 었습니다.\n 변경된 내용을 저장 하시겠습니까?",
            "메모장",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE,null, options,options[0]);
    }
   }
   else if(gac.equals("열기"))
   {
    cnt=0;
    ta.setText("");
    openDocument();
   }
   else if(gac.equals("저장"))
   {
    saveDocument(false);
   }
   else if(gac.equals("다른이름으로저장"))
   {
    saveDocument(true);
   }
   else if(gac.equals("페이지설정"))
   {
      printPage();
   }
   else if(gac.equals("인쇄"))
   {
      printDocument();
   }
   else if(gac.equals("끝내기"))
   {
    System.exit(0);
   }
   else if(gac.equals("실행취소"))
   {
    undoManager.undo();
   }
   else if(gac.equals("삭제"))
   {
    ta.replaceRange("",ta.getSelectionStart(), ta.getSelectionEnd());
   }
   else if(gac.equals("찾기"))
   {
    FindDialog fd=new FindDialog(this);
    fd.setBounds(getX()+40,getY()+70,450,150);
    fd.show();    
   }
   else if(gac.equals("바꾸기"))
   {
    ChangeDialog cd=new ChangeDialog(this);
    cd.setBounds(getX()+40,getY()+70,450,200);
    cd.show();      
   }
   else if(gac.equals("이동"))
   {
    MoveDialog md=new MoveDialog(this);
    md.setBounds(getX()+40,getY()+70,250,130);
    md.show();  
    int line= md.lineNumber();
    //viewPort.setViewPosition(new Point(0,line));
    ta.setCaretPosition(line);
    //System.out.print(line);
   }   
   else if(gac.equals("자동줄바꿈"))
   {
    if(mi31.getState())
     ta.setLineWrap(true);
    else
     ta.setLineWrap(false);
   }
   else if(gac.equals("글꼴"))
   {
    FontDialog ftd=new FontDialog(this);
    ftd.setBounds(getX()+40,getY()+70,530,320);    
    ftd.show(); 
    Font ft= ftd.fontSet();
    ta.setFont(ft);
   }
   else if(gac.equals("모두선택"))
   {    
    ta.selectAll ();
    ta.requestFocus();
   }
   else if(gac.equals("메모장정보"))
   {    
    HelpDialog hd=new HelpDialog(this);
    hd.setBounds(getX()+40,getY()+70,411,313);
    hd.show();
   }
   else if(gac.equals("도움말항목"))
   {
    //String [] cmdar={"/img/hh.exe","/img/notepad.chm","/img/hh.exe"};
    //Process p = Runtime.getRuntime().exec("/img/hh.exe notepad.chm");
    //Process p = Runtime.getRuntime().exec(cmdar);
    //Process p = Runtime.getRuntime().exec("C:/WINNT/help/hh.exe notepad.chm");
    Process p = Runtime.getRuntime().exec("C:/WINNT/notepad.exe"); 
   }
  }catch(Exception e){}
 }
 
 public void openDocument()
 {
   JFileChooser chooser=new JFileChooser();
  System.out.println(chooser.getFileFilter() );
   chooser.setDialogTitle("파일 열기");
   int returnVal=chooser.showOpenDialog(this);
   if(returnVal !=JFileChooser.APPROVE_OPTION)//cancel 버튼이 눌려지면 취소
    return;
    File f=chooser.getSelectedFile();//대화상자에서 선택된 파일객체 인스턴스를 구한다
   
   if(!f.exists())
   {//파일이 존재하지 않으면 에러 메세지를 띄운후 취소
     JOptionPane.showMessageDialog(this,file.getName()+" 파일을 찾을 수 없습니다.",
      "파일 열기 에러",JOptionPane.ERROR_MESSAGE);
      return;
   }
  openFile(f);
 }///////////////////////openDocument() ////////////////////
 
 public void openFile(File file)
 {///파일을 읽어들여 jta에 표시
  
  BufferedReader in=null;//버퍼 문자 입력 스트림
  //ta.setText("");//텍스트에리어 내용 초기화
  setTitle(file.getName());//윈도우 제목을 파일 이름으로
   try
   {
   in=new BufferedReader(new FileReader(file));
   }
   catch(FileNotFoundException fnfe)
   {//에러 메세지
    System.err.println("파일 열기 에러 :"+file.getName()+"파일을 찾을 수 없습니다.");
    JOptionPane.showMessageDialog(this,file.getName()+"파일을 찾을 수 없습니다.","파일 열기에러",JOptionPane.ERROR_MESSAGE);
    return;
   }
   catch(Exception e)
   {
    System.err.println("파일 열기 에러 :"+file.getName()+"파일을 찾을 수 없습니다.");
    JOptionPane.showMessageDialog(this,e.getMessage(),"파일 열기에러",JOptionPane.ERROR_MESSAGE);
    return;
   }
   
   try
   {////한 줄씩 읽어서 string형에 저장한후 ta에 보낸다
    String string="";    
    while((string=in.readLine())!=null)
    {
     st=st+(string+'\n');
    }
   ta.setText("");
   ta.setText(st);   
   }
   catch(IOException ie)
   {
   System.err.println("파일 읽기 에러 :"+ie.getMessage());
   }
   try
   {
    in.close();//입력 스트림 닫는다.
   }catch(IOException ie){}
   
   ta.setCaretPosition(0);//커서를 처음으로 위치
   viewPort.setViewPosition(new Point(0,0));//위쪽을 보여줌
  System.out.print(file.getName());
   this.file=file;//읽어들인 파일을 file멤버 필드로 설정
 }//////////////////////////////////////openFile(File file) end/////////////////
 public File getFile()
 {///문서 윈도우의 내용을 파일로 알림
  return file;
 }
 
 public void saveDocument(boolean isSaveAs)
 {//true면 새이름으로 false면 저장
  if(isSaveAs==true)
  {//새이름으로 저장할 경우 파일 대화상자 표시
   JFileChooser chooser=new JFileChooser();
   chooser.setDialogTitle("새 이름으로 저장");
   int returnVal=chooser.showSaveDialog(this);
   
    if(returnVal !=JFileChooser.APPROVE_OPTION)
     return;
    File f=chooser.getSelectedFile();
    if(f.exists())
    {//파일 이름이 이미 존재하면 덮어쓸 것인지 물어본다
     Object options[]={"예","아니오"};
     if(JOptionPane.showOptionDialog(this,"파일이 이미 존재 합니다.덮어쓸까요?","경고",
      JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null,options,options[0]) !=0)
       return;//아니오를 선택하면 저장취소
    }
    saveFile(f);
   }
    else if(isSaveAs==false)
    {//현재 문서 윈도우에 지정된 파일 인스턴스를 가져온다.
    File f=getFile();
   if(f==null)
   {
    saveDocument(true);
   }
     if(!f.exists())
     {//파일이 이미 존재하지 않으면 저장을 계속할 것인지 한번더 확인 한다.
      Object options[]={"예","아니오"};
     if(JOptionPane.showOptionDialog(this,"파일이 존재하지 않습니다.그래도 저장 할까요?","경고",
      JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null,options,options[0]) !=0)
       return;
     }     
    }
   }/////////saveDocument(boolean isSaveAs) end//////////////
 
 public void saveFile(File file)
 {///////////file 인자로 지정된 파일로 현재 내용 저장
  PrintWriter out=null;//문자 출력 스트림
  
   try
   {
    out=new PrintWriter(new BufferedWriter(new FileWriter(file)));
   }
   catch(IOException ie)
   {
    System.err.println("파일 저장 에러 :"+file.getName()+"파일을 생성 할 수 없습니다.");
    JOptionPane.showMessageDialog(this,file.getName()+"파일을 생성 할 수 없습니다.",
     "파일 저장 에러",JOptionPane.ERROR_MESSAGE);
   }
   
   String string=ta.getText();
   out.print(string);//실제 파일에 쓴다
   if(out.checkError())
   {//print() 메서드는  IOException을 던지지 않으므로 직접 검사를 해보아야 한다.
     System.err.println("파일 쓰기 에러");
   }
   else
   {
     JOptionPane.showMessageDialog(this,file.getName()+" 파일을 저장 하였습니다.","안내 메세지",JOptionPane.INFORMATION_MESSAGE);
   }
   out.close();//출력 스트림을 닫는다.
   setTitle(file.getName());//현재 파일 이름으로 윈도우 제목 설정
   this.file=file;//현재 저장된 파일 객체 인스턴스를 멤버 필드값으로 저장
 }////////////////////////////////////////saveFile(File file) end//////////////////
 
 public void printPage()
 {/////쪽 설정////
  PrinterJob pj=PrinterJob.getPrinterJob();
  pj.setPrintable(this);
  pj.pageDialog(pj.defaultPage());     
 }///쪽설정 끝////
 
 public void printDocument()
 {////프린트//////
  try{
   PrinterJob pj=PrinterJob.getPrinterJob();
   pj.setPrintable(this);
   pj.printDialog();
   pj.print();
   }catch(Exception e){}
 }////프린트 끝//// 
  
 public int print(Graphics g, PageFormat pf, int pi)throws PrinterException
 {////////Printable 구현/////////  
  if (pi >= 1)
  {
   return Printable.NO_SUCH_PAGE;
  }
  Graphics g2=(Graphics2D)g;
  g2.translate((int)pf.getImageableX(),(int)pf.getImageableY());
  this.paint(g2);
  return Printable.PAGE_EXISTS;
  }////////Printable 구현 끝/////////
 
 public void lostOwnership(Clipboard cb, Transferable contents){}//ClipboardOwner 구현
 
 public void undoableEditHappened(UndoableEditEvent undoe)
 {//UndoableEditListener 구현
  if(undoManager !=null)
   undoManager.addEdit(undoe.getEdit());
 }//UndoableEditListener 구현 끝   
 
  public static void main(String args[])
 {
  Jmemo jm=new Jmemo("제목 없음 - 메모장");
  jm.setBounds(300,200,600,400);
  jm.setVisible(true) ;
 }
}
class FindDialog extends JDialog implements ActionListener
{
  private JLabel fjdl = new JLabel();
  private JTextField jfdt = new JTextField();
  private JButton jdsbn = new JButton();
  private JButton jfdc = new JButton();
  private JPanel jfdp = new JPanel();
  private TitledBorder titledBorder1;
  private JRadioButton jfdup = new JRadioButton();
  private JRadioButton jfddown = new JRadioButton();
  private JCheckBox jfdul = new JCheckBox();
  public FindDialog(Frame parent)
 {
    super(parent,"찾기",false);
  
  setResizable(false);
    titledBorder1 = new TitledBorder(new EtchedBorder(EtchedBorder.RAISED,Color.gray,Color.white),"방향");
    jfdc.setBounds(342, 63, 98, 26);
    jfdc.setText("취소");
  jfdc.addActionListener(this);
    jdsbn.setBounds(342, 28, 98, 26);
    jdsbn.setText("다음 찾기");  
  jdsbn.addActionListener(this);  
  jdsbn.setEnabled(false);//첫 프로그램 실행시 선택 되지 않게 설정
  fjdl.setText("찾을 내용:");
    fjdl.setBounds(17, 29, 58, 24);
    this.getContentPane().setLayout(null);
    jfdt.setBounds(94, 29, 235, 21);
    jfdp.setBorder(titledBorder1);
    jfdp.setBounds(128, 59, 200, 45);
    jfdp.setLayout(null);
    jfdup.setText("위쪽");
    jfdup.setBounds(18, 20, 62, 14);
    jfddown.setText("아래쪽");
    jfddown.setBounds(108, 20, 62, 14);
    jfdul.setText("대/소문자 구분");
    jfdul.setBounds(20, 75, 101, 26);
    this.getContentPane().add(fjdl, null);
    this.getContentPane().add(jfdt, null);
    this.getContentPane().add(jdsbn, null);
    this.getContentPane().add(jfdc, null);
    this.getContentPane().add(jfdp, null);
    jfdp.add(jfdup, null);
    jfdp.add(jfddown, null);
    this.getContentPane().add(jfdul, null);
  
  //jfdt.requestFocus();
   jfdt.setCaretPosition(0);
  }
 
 public void actionPerformed(ActionEvent ae)
 {
  try{
  String gac=ae.getActionCommand();
  
   if(gac.equals("취소"))
   {
    dispose();
   }
   else if(gac.equals("다음 찾기"))
   {
   }
  }catch(Exception e){} 
 }  
}
class ChangeDialog extends JDialog implements ActionListener
{
  private JLabel jcdl1 = new JLabel();
  private JLabel jcdl2 = new JLabel();
  private JTextField jcdtf1 = new JTextField();
  private JTextField jcdtf2 = new JTextField();
  private JButton jcdb1 = new JButton();
  private JButton jcdb2 = new JButton();
  private JButton jcdb3 = new JButton();
  private JButton jcdb4 = new JButton();
  private JCheckBox jcdcb = new JCheckBox();
  public ChangeDialog(Frame parent)
 {
    super(parent,"바꾸기",false);
  
  setResizable(false);
    jcdcb.setText("대/소문자 구분");
    jcdcb.setBounds(24, 125, 178, 24);
    jcdb4.setBounds(318, 135, 106, 28);
    jcdb4.setText("취소");
    jcdb3.setBounds(318, 102, 106, 28);
    jcdb3.setText("모두 바꾸기");
    jcdb2.setBounds(318, 68, 106, 28);
    jcdb2.setText("바꾸기");
    jcdb1.setBounds(318, 35, 106, 28);
    jcdb1.setText("다음 찾기");
    jcdtf2.setBounds(100, 75, 197, 22);
    jcdtf1.setBounds(100, 39, 197, 22);
    jcdl2.setText("바꿀 내용: ");
    jcdl2.setBounds(20, 59, 79, 28);
    jcdl1.setText("찾을 내용: ");
    jcdl1.setBounds(20, 29, 79, 28);
    this.getContentPane().setLayout(null);
    this.getContentPane().add(jcdtf2, null);
    this.getContentPane().add(jcdl1, null);
    this.getContentPane().add(jcdl2, null);
    this.getContentPane().add(jcdtf1, null);
    this.getContentPane().add(jcdb1, null);
    this.getContentPane().add(jcdb2, null);
    this.getContentPane().add(jcdb3, null);
    this.getContentPane().add(jcdb4, null);
    this.getContentPane().add(jcdcb, null);
  }
 
 public void actionPerformed(ActionEvent ae)
 {
  dispose();
 }  
}
class MoveDialog extends JDialog implements ActionListener
{
 private JTextField jmdt = new JTextField();
 private JButton jmdb1 = new JButton();
 private JButton jmdb2 = new JButton();
 String getline   = new String();
 
 public MoveDialog(Frame parent)
 {
    super(parent,"이동",true);
  
  jmdt.setBounds(14, 21, 115, 26);
    this.getContentPane().setLayout(null);
    jmdb1.setBounds(143, 16, 87, 29);
    jmdb1.setText("확인");
  jmdb1.addActionListener(this);
    jmdb2.setBounds(144, 60, 87, 29);
    jmdb2.setText("취소");
  jmdb2.addActionListener(this);
    this.getContentPane().add(jmdb1, null);
    this.getContentPane().add(jmdb2, null);
    this.getContentPane().add(jmdt, null);  
 }
 
 public int lineNumber()
 {  
  return Integer.parseInt(getline);
 }
 
 public void actionPerformed(ActionEvent ae)
 {
  try{
   String gac=ae.getActionCommand();
   
   if(gac.equals("확인"))
   {    
    getline=jmdt.getText();  
    dispose();
   }
   else if(gac.equals("취소"))
   {
    dispose();
   }
  }catch(Exception e){}
 } 
}
class FontDialog extends Dialog implements ActionListener
{
  private Label jfdl1 = new Label();
  private Label jfdl2 = new Label();
  private Label jfdl3 = new Label();
  private Label jfdl4 = new Label();
  private Label jfdl5 = new Label();
  private Label jfdl6 = new Label();
  private TextField jfdtf1 = new TextField();
  private TextField jfdtf2 = new TextField();
  private TextField jfdtf3 = new TextField();
  private List jfdls1 = new List();
  private List jfdls2 = new List();
  private List jfdls3 = new List();
  private Choice jfdcb = new Choice();
  private Button jfdb1 = new Button();
  private Button jfdb2 = new Button();
  private TextField jfdtf4 = new TextField();
  Graphics g;
 
 Font f;
 String fontname="SansSerif";
 int fontstyle=Font.PLAIN;
 int size=8;
 
  String [] allFonts=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
  private String [] allSizes = {"8","9","10","11","12","14","16","18","20","22","24","26","28","36","48","72"};
  private String [] allStyle ={"보통","기울임꼴","굵게","굵은 기울임꼴"};
  FontDialog(Frame parent) 
 {
    super(parent,"글꼴",true);
  
  setResizable(false);
  addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent we){dispose();}});
      setLayout(null);
  
  for(int i=0;i<allFonts.length;i++)
  {
  jfdls1.add(allFonts[i]);
  }
  
  for(int i=0;i<16;i++)
  {
   jfdls3.add(allSizes[i]);
  }  
  
  for(int i=0;i<4;i++)
  {
   jfdls2.add(allStyle[i]);
  }
    jfdl1.setText("글꼴");
    jfdl1.setBounds(10, 24, 98, 26);
    jfdl2.setText("글꼴 스타일");
    jfdl2.setBounds(198, 26, 98, 26);
    jfdl3.setText("크기");
    jfdl3.setBounds(340, 24, 98, 26);
    jfdl4.setText("보기");
  jfdl4.setBounds(266,157,49,25);
  jfdl5.setText("스크립트");
    jfdl5.setBounds(266, 236, 98, 25);
    jfdtf1.setBounds(10, 49, 181, 24);
    jfdtf2.setBounds(201, 49, 129, 24);
    jfdtf3.setBounds(340, 49, 91, 24);
    jfdls1.setBounds(10, 77, 181, 79);
  jfdls1.addActionListener(this);
    jfdls2.setBounds(201, 77, 129, 79);
  jfdls2.addActionListener(this);
    jfdls3.setBounds(340, 77, 91, 79);
  jfdls3.addActionListener(this);
    jfdcb.setBounds(258, 263, 180, 22);
    jfdb1.setBounds(436, 51, 82, 28);
    jfdb1.setLabel("확인");
  jfdb1.addActionListener(this);
    jfdb2.setBounds(436, 85, 82, 28);
    jfdb2.setLabel("취소");
  jfdb2.addActionListener(this);
  add(jfdcb);
  add(jfdl4);
  add(jfdl5);
  add(jfdl1);
  add(jfdtf1);
  add(jfdls1);
  add(jfdb1);
  add(jfdb2);
  add(jfdls3);
  add(jfdl3);
  add(jfdtf3);
  add(jfdls2);
  add(jfdtf2);
  add(jfdl2);  
  
  jfdl6.setBounds(212, 190,220,40);
  jfdl6.setText("가나다AaBbYyZz");
  add(jfdl6);
 }
 
 public void paint(Graphics g)
 {
  g.setColor(Color.lightGray);
  g.draw3DRect (202, 182, 232, 50,false);
  g.setColor(Color.black);  
 }
 
 public Font fontSet()
 {
  jfdls1.getSelectedItem();
  fontname=jfdls1.getSelectedItem();
  
  if(jfdls2.getSelectedItem().equals("보통"))
   fontstyle=Font.PLAIN;
  if(jfdls2.getSelectedItem().equals("기울임꼴"))
   fontstyle=Font.ITALIC;   
  if(jfdls2.getSelectedItem().equals("굵게"))
   fontstyle=Font.BOLD;
  if(jfdls2.getSelectedItem().equals("굵은 기울임꼴"))
   fontstyle=Font.ITALIC+Font.BOLD;
  
  jfdtf3.setText(jfdls3.getSelectedItem());   
   size=Integer.parseInt(jfdls3.getSelectedItem());
  
  return f=new Font(fontname,fontstyle,size);
 }
  
 public void actionPerformed(ActionEvent ae)
 {
  if((ae.getSource()).equals(jfdls1))
  {
   jfdtf1.setText(jfdls1.getSelectedItem());
   fontname=jfdls1.getSelectedItem();
   f=new Font(fontname,fontstyle,size);
   jfdl6.setFont(f); 
  }
  else if((ae.getSource()).equals(jfdls2))
  {
   jfdtf2.setText(jfdls2.getSelectedItem());
   
   if(jfdls2.getSelectedItem().equals("보통"))
    fontstyle=Font.PLAIN;
   if(jfdls2.getSelectedItem().equals("기울임꼴"))
    fontstyle=Font.ITALIC;   
   if(jfdls2.getSelectedItem().equals("굵게"))
    fontstyle=Font.BOLD;
   if(jfdls2.getSelectedItem().equals("굵은 기울임꼴"))
    fontstyle=Font.ITALIC+Font.BOLD;
  
   f=new Font(fontname,fontstyle,size);
   jfdl6.setFont(f);   
  }
  else if((ae.getSource()).equals(jfdls3))
  {
   jfdtf3.setText(jfdls3.getSelectedItem());   
   size=Integer.parseInt(jfdls3.getSelectedItem());
   f=new Font(fontname,fontstyle,size);
   jfdl6.setFont(f);  
  }
  else if((ae.getSource()).equals(jfdb1))
  {
   dispose();
  }
  else if((ae.getSource()).equals(jfdb2))
  {
   dispose();
  }
 }  
}
class HelpDialog extends Dialog implements ActionListener
{//도움말 새창
 Button ok;//누르면 창이 닫히는 버튼
 Image img=getToolkit().getImage("img/memo.gif");
 Image mh=getToolkit().getImage("img/mh.gif");
 Image minfo=getToolkit().getImage("img/minfo.gif");
 Font f=new Font("굴림",Font.PLAIN,12);
 
 HelpDialog(Frame parent)
 {
  super(parent,"메모장 정보",true);
  
  setResizable(false);  
  
  setLayout(null);
  ok=new Button("확 인");
  ok.addActionListener(this);
  ok.setBounds(290,280,90,25);  
  add(ok);    
    
  addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent we){dispose();}}); 
 } 
 
 public void paint(Graphics g)
 {
  Insets insets=getInsets();  
  
  g.setFont(f);
  g.drawImage(minfo,insets.left,insets.top,410,77,this);
  g.drawImage(mh,15,105,32,30,this);  
  g.drawString("Wicrosoft (R) 메모장",66,120);
  g.drawString("버전 1.0 (빌드 2195: Service Pack 3)",66,137);
  g.drawString("Copyright (C) 1981-1999 Wicrosoft Corp.",66,153);
  g.drawString("이 제품은 다음 사용자에게 사용이 허가되었습니다.",66,200);
  g.drawString("jdk 깔린 컴텨",66,216);
  g.setColor(Color.lightGray);
  g.draw3DRect (66,248,334,1,false);
  g.setColor(Color.black);
  String p= Runtime.getRuntime().totalMemory()/1024+"";   
  g.drawString("Virtual Machine에서 사용할 수 있는 실제 메모리: "+p ,66,265); 
 }
 
 public void actionPerformed(ActionEvent ae)
 {
  dispose();
 }  
}

첨부 파일 - 이미지+ 도움말... ( 경로 /img )


void main()
{
int i=0;
for(i=0;i<100;i++)
{
//printf("%d,%d",i,k);
int k=0;
while(k<i)
{
//printf("i는 %d,k는 %d",i,k);
printf("*");
k++;
}
printf("\n");
}

}
하면
*
**
***
......
등으로 나온다.


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.filechooser.*;

public class NotePadExam extends JFrame
{
 JFrame jf,jf2;
 JPanel jp1,jp2;
 JMenuBar jmb;
 JMenu jmFile;
 JMenuItem jmi_CreateNew,jmi_Open,jmi_Save,jmi_OtherSave,jmi_Exit;
 JLabel jlb1;
 JTextArea jta;
 JDialog jd;

 public NotePadExam()
 {
 super("제목없음");
 try
 {
 
  //this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  //jf = new JFrame();
  jf = this;
  jf.getContentPane().setLayout(new FlowLayout());
  //jf.getContentPane().setLayout(new BorderLayout());
  //jf = new JFrame();
 
  jp1 = new JPanel();
  jp2 = new JPanel();
  //jp1.setLayout(new FlowLayout());
 
  jmb = new JMenuBar();
  /*//////////////
  파일메뉴추가
  /*//////////////
  jmFile = new JMenu("파일");

 

  //jm=createMenuItem(jm,"열기");
  //jm=createMenuItem(jm,"저장");
  //jm=createMenuItem(jm,"다른이름으로 저장");
  //jm=createMenuItem(jm,"끝내기");
 
 
  jta = new JTextArea();

  JScrollPane scrollPane = new JScrollPane();
 scrollPane.setPreferredSize(new Dimension(450,400));
 scrollPane.setBorder(BorderFactory.createTitledBorder(""));
 scrollPane.getViewport().add(jta, null);

 //jpanel.add(scrollPane);

 

  //jta.setSize(30,50);
 
  //jd = new JDialog(this,"yes");
  //jd.setLayout(new FlowLayout());
  //jd.add(new Button("저장"));
  //jd.setSize(100,100);
 


  //jd.setVisible(true);
  //새로 만들기 이벤트 생성
  makeNewDoc(createMenuItem(jmFile,"새로만들기"),jta);
  //문서열기
  openDoc(createMenuItem(jmFile,"열기"),jta);
  //메뉴바추가
  jmb.add(jmFile);
  /*//////////////
  파일메뉴추가
  /*//////////////

  jp1.add(jmb);

  //jmb.setSize(50,200);
  //텍스트창추가
  jp2.add(scrollPane);

  jf.add(jp1);
  jf.add(jp2);
 

  //add(jf); 
  //jf.getContentPane().add(jp1,BorderLayout.CENTER);
  //createDialogBOx(this);

  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 }
 catch (Exception ex)
 {
  ex.printStackTrace();
 }
 }

 public void openDoc(JMenuItem jmim,final JTextArea jtaa)
 {
  //문서열기 작업하기
 
  ActionListener al = new ActionListener()
  {
   public void actionPerformed(ActionEvent ae)
   {

    System.out.println("문서열기");

    String jtaaStr = jtaa.getText().trim();

    if(!jtaaStr.equals("") && jtaaStr != null)
    {
     System.out.println("널값 아님");
     //doOpenDialogForSave(jtaa);
     //기존파일이 있는 경우 저장창이 나온다.
    }
    else
    {
     //파일열기 대화상자를 열어야 한다.    
     NotePadJFileChooser dpjc = new NotePadJFileChooser("열기");
     int returnVal = dpjc.showOpenDialog(NotePadExam.this);
     if(returnVal == JFileChooser.APPROVE_OPTION)
     {
      File selectedFile = dpjc.getSelectedFile();
      FileInputStream fis=null;
   //FileOutputStream fos = null;
   BufferedInputStream dos = null;
      //StringBuffer strB = new StringBuffer();
      try
      {
       fis = new FileInputStream(selectedFile);   
    //dos = new BufferedInputStream(fis);
    byte[] buffer = new byte[512];
    int readcount = 0;
    //StringBuffer openedFileBuffer = new StringBuffer();
    String str = new String();
   
       while((readcount = fis.read(buffer)) != -1)
       {
  str+=new String(buffer,0,readcount,"EUC-KR");
  //System.out.println(str);
  
   //  for(int i=readcount;i<buffer
   // System.out.println(buffer.toString());
   //System.out.write(buffer,0,readcount);
   //openedFileBuffer.append(buffer,0,readcount);       
       }
   // System.out.println(openedFileBuffer);
  
    //jtaa.setText(openedFileBuffer);
    //BufferedInputStream bis = new BufferedInputStream(dos);
    System.out.println(str);
       jtaa.setText(str);
    jtaa.requestFocus();
    //jtta.setFocusable(true);
    //jtta.setCaretPosition(0);

      }
      catch (IOException ioe)
      {
       ioe.printStackTrace();
      }
      finally
      {
       try
       {
        fis.close();
       }
       catch (IOException e)
       {
       
       }
      
      }

     }
    }
   }
  };

  jmim.addActionListener(al);
 }
 public void makeNewDoc(JMenuItem jmim,final JTextArea jtaa)
 {
 //새파일 만들기 알고리즘////////////////////////////////////////////////////////////////////
 //새로만들기 메뉴아이템 이벤트 생성
 //1) 작업하던 문서가 없는 경우 바로 새문서 만듬///////////////////////////////////////////
 //2) 작업하던 문서가 있는 경우(저장 안했을 경우) 저장,저장안함,취소를 물어본후 1번 작업//
 //3) 작업하던 파일이 전과 비교했을 경우 변경된 게 없는 경우 이전 문서 닫고 새문서 만듬//
 ////////////////////////////////////////////////////////////////////////////////////////////
  
  ActionListener al = doOpenDialogForSave(jtaa);

  jmim.addActionListener(al);


 }
 
 public ActionListener doOpenDialogForSave(final JTextArea jtaa)
 {
  //return new ActionListener(){public void actionPerformed(ActionEvent ae){}};
 
  ActionListener al = new ActionListener()
  {
   public void actionPerformed(ActionEvent ae)
   {
    String str = jtaa.getText().trim();
    String msg[] = {"저장","저장안함","취소"};
    //일단 작업하던 문서가 있는 지 없는 지 체크함
   
    if(str.equals("") || str == null)
    {
     createNewDoc(jtaa);
    }
    else
    {   
     //System.out.println("dddd");
     int dialogResult =
     JOptionPane.showOptionDialog(
             NotePadExam.this,
           "변경된 내용을 저장하시겠습니까?",
           "새로만들기",
           JOptionPane.YES_NO_CANCEL_OPTION,
           JOptionPane.QUESTION_MESSAGE,
           null,msg,msg[0]
             );
    
     if(dialogResult == JOptionPane.YES_OPTION)   
      saveDoc(jtaa);//저장메소드
     else if(dialogResult == JOptionPane.NO_OPTION)//저장취소메소드
      createNewDoc(jtaa);//저장취소
     else //취소
      System.out.print("cancel");
     //저장하던 문서가 있는경우 저장,저장안함,취소 물어봄
    
    }
    //System.out.println("새로만들기 클릭했음");
   }
  };
  return al;
 }
 
 public void saveDoc(JTextArea jta)
 {
  NotePadJFileChooser jfChooser = new NotePadJFileChooser("저장");

  int returnVal = jfChooser.showOpenDialog(this);
  if(returnVal == JFileChooser.APPROVE_OPTION)
  {
   //System.out.println("You were choosen file what named " +jfChooser.getSelectedFile().getName());
   String savingFileName = jfChooser.getSelectedFile().getName();
   FileWriter fw = null;
   try
   {
    File choosenFileDirectory = new File(jfChooser.getCurrentDirectory().getAbsolutePath()+"\\"+savingFileName+".txt");

    //System.out.println(choosenFileDirectory.getAbsolutePath());
   
    fw = new FileWriter(choosenFileDirectory);
    fw.write(jta.getText());
    fw.close();
    this.setTitle(savingFileName);
   }
   catch (IOException ie)
   {
    ie.printStackTrace();
   }
  }
 
  //this.setTitle("안녕");//쓰불 타이틀 바꾼다고 몇시간 뻘짓 했넹..==;
  //StringBuffer strB = new StringBuffer(jta.getText());
 
 }
 /*
 public void fileWrite(InputStream in)
 {
  byte[] buffer = new byte[512];
  int readcount = 0;

  try
  {
   while((readcount = in.read(buffer)) != -1)
   {
    System.out.write(buffer,0,readcount);
   }
  }
  catch (IOException e)
  {
   System.out.println(e);
  }
 }
 */
 public void createNewDoc(JTextArea jtaa)
 {
//  if(jf==null)
//  setTitle("");
 
  //super.setTitle("새로만들기");
  //setTitle2("새로만들자");
  this.setTitle("제목없음");
  jtaa.setText("");

 }
 public JMenuItem createMenuItem(JMenu jmu,String name2)
 {
  //System.out.println("111111111");
  JMenuItem jmui = new JMenuItem(name2); 
  jmu.add(jmui);
  return jmui;
 }
 public static void main(String[] args)
 {
  NotePadExam npe = new NotePadExam();
  npe.setSize(500,500);
  npe.setVisible(true);

 //System.out.println("Hello World!");
 }
}
class NotePadJFileChooser extends JFileChooser
{
 //JFileChooser jfChooser;
 FileNameExtensionFilter filter;

 public NotePadJFileChooser(String buttonName)
 {
  super();
  filter =  new FileNameExtensionFilter(
          "텍스트 문서(*.txt)"
          ,"txt"
          );
  this.setFileFilter(filter);
  this.setApproveButtonText(buttonName);
  this.setApproveButtonToolTipText(buttonName);

 }
 /*
 JFileChooser jfChooser = new JFileChooser();
  FileNameExtensionFilter filter =
  jfChooser.setFileFilter(filter);
  jfChooser.setApproveButtonText("저장");
  jfChooser.setApproveButtonToolTipText("저장하기");
  int returnVal = jfChooser.showOpenDialog(this);
 */
}

'자바 > 메모장' 카테고리의 다른 글

java메모장만들기 2일차(2시간 작업)  (0) 2010.10.18
메모장 제 1일차(2시간작업)  (0) 2010.10.14


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class NotePadExam extends JFrame
{
 JFrame jf,jf2;
 JPanel jp1,jp2;
 JMenuBar jmb;
 JMenu jmFile;
 JMenuItem jmi_CreateNew,jmi_Open,jmi_Save,jmi_OtherSave,jmi_Exit;
 JLabel jlb1;
 JTextArea jta;
 ActionListener al;
 JDialog jd;

 public NotePadExam()
 {
 //super("메모장");
 try
 {
  
  //this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  //jf = new JFrame();
  jf = this; 
  jf.getContentPane().setLayout(new FlowLayout());
  //jf.getContentPane().setLayout(new BorderLayout());
  //jf = new JFrame();
  
  jp1 = new JPanel();
  jp2 = new JPanel();
  //jp1.setLayout(new FlowLayout());
  
  jmb = new JMenuBar();
  /*//////////////
  파일메뉴추가
  /*//////////////
  jmFile = new JMenu("파일");

  

  //jm=createMenuItem(jm,"열기");
  //jm=createMenuItem(jm,"저장");
  //jm=createMenuItem(jm,"다른이름으로 저장");
  //jm=createMenuItem(jm,"끝내기");
  
  
  jta = new JTextArea(10,25);
  //jta.setSize(30,50);
  
  //jd = new JDialog(this,"yes");
  //jd.setLayout(new FlowLayout());
  //jd.add(new Button("저장"));
  //jd.setSize(100,100);
  


  //jd.setVisible(true);
  //새로 만들기 이벤트 생성
  makeNewEvent(createMenuItem(jmFile,"새로만들기"),jta);

  //메뉴바추가
  jmb.add(jmFile);
  /*//////////////
  파일메뉴추가
  /*//////////////

  jp1.add(jmb);

  //jmb.setSize(50,200);
  //텍스트창추가
  jp2.add(jta);

  jf.add(jp1);
  jf.add(jp2);
  

  //add(jf);  
  //jf.getContentPane().add(jp1,BorderLayout.CENTER);
  //createDialogBOx(this);

  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 }
 catch (Exception ex)
 {
  ex.printStackTrace();
 }
 }

 public void makeNewEvent(JMenuItem jmim,final JTextArea jtaa)
 {
 //새파일 만들기 알고리즘////////////////////////////////////////////////////////////////////
 //새로만들기 메뉴아이템 이벤트 생성
 //1) 작업하던 문서가 없는 경우 바로 새문서 만듬///////////////////////////////////////////
 //2) 작업하던 문서가 있는 경우(저장 안했을 경우) 저장,저장안함,취소를 물어본후 1번 작업//
 //3) 작업하던 파일이 전과 비교했을 경우 변경된 게 없는 경우 이전 문서 닫고 새문서 만듬//
 ////////////////////////////////////////////////////////////////////////////////////////////
 al = new ActionListener()
 {
  public void actionPerformed(ActionEvent ae)
  {
   String msg[] = {"저장","저장안함","취소"};
   //일단 작업하던 문서가 있는 지 없는 지 체크함
   String str = jtaa.getText().trim();
   if(str.equals("") || str == null)
   {
    createNewDoc(jtaa);
   }
   else
   {
    //System.out.println("dddd");
    JOptionPane.showConfirmDialog(
            NotePadExam.this,
             "변경된 내용을 저장하시겠습니까?",
          "새로만들기",
             JOptionPane.YES_NO_CANCEL_OPTION,
          null,"저장","저장안함","취소"
            );
    //저장하던 문서가 있는경우 저장,저장안함,취소 물어봄
    
   }
   //System.out.println("새로만들기 클릭했음");
  }
 };

 jmim.addActionListener(al);


 }
 public static void createNewDoc(JTextArea jtaa)
 {
//  if(jf==null)
//  setTitle("");
  jtaa.setText("");

 }
 public JMenuItem createMenuItem(JMenu jmu,String name2)
 {
  //System.out.println("111111111");
  JMenuItem jmui = new JMenuItem(name2); 
  jmu.add(jmui);
  return jmui;
 }
 public static void main(String[] args)
 {
  NotePadExam npe = new NotePadExam();
  npe.setSize(300,300);
  npe.setVisible(true);

 //System.out.println("Hello World!");
 }
}

 

잘사용하시면, 간편하게 훌륭한 대화상자들을 만들어 낼수 있습니다.

끝부분에 커스터마이징 부분을 잘 보시길 바랍니다.

 

BEYOND THE BASICS OF JOPTIONPANE

The Swing component set in J2SE includes a special class for creating a panel to be placed in a popup window. You can use this panel to display a message to the user and to get a response from the user. The panel presents content in four areas, one each for an icon, message, input, and buttons. You don't need to use any of the areas, although you would typically present at least a message and a button.

The icon area is for the display of a javax.swing.Icon. The icon is meant to indicate the type of message being displayed. There are default icons provided by the specific look and feel you use. The default images for these icons are specified through a property setting to the look and feel. The property setting points to the appropriate resource for each message type:

  • OptionPane.informationIcon
  • OptionPane.warningIcon
  • OptionPane.errorIcon
  • OptionPane.questionIcon

You don't have to change the default properties, though you could with a call to UIManager.put(property name, new resource). With the defaults in place, you simply identify the appropriate message type with a constant of JOptionPane:

  • JOptionPane.PLAIN_MESSAGE
  • JOptionPane.INFORMATION_MESSAGE
  • JOptionPane.WARNING_MESSAGE
  • JOptionPane.ERROR_MESSAGE
  • JOptionPane.QUESTION_MESSAGE

The plain variety maps to no icon, while the others use a default icon from the look and feel.

The second area of the JOptionPane is the message area. This is typically used to display a text message. However, you could show any number of objects here. The message type determines how a message is displayed.

The input area is next. Here is where you can get a response to a message from the user. To prompt for a response you can use a free form text field, a combo box, or even a list control. For Yes/No type prompts, you would instead use the button area, described next.

Last is the button area, another response-like area. When a user selects a button it signals the end of usage for the JOptionPane. Default sets of button labels are available. (As is the case for icons, these too come from property settings, such as OptionPane.yesButtonText.) You can also provide your own button labels. You can display any number of buttons (including no buttons) with any set of labels. The predefined button label is localized for several languages: English (en), German (de), Spanish (es), French (fr), Italian (it), Japanese (ja), Korean (ko), Swedish (sv), and two varieties of Chinese (zh_CN / zh_TW). If you provide your own labels, you need to localize them yourself.

The predefined sets of buttons are defined by a set of JOptionPane constants:

  • DEFAULT_OPTION
  • YES_NO_OPTION
  • YES_NO_CANCEL_OPTION
  • OK_CANCEL_OPTION

Default maps to a single OK button.

Using JOptionPane

The JOptionPane class contains seven constructors, each returns a component that you can place anywhere. However, more typically you would use a factory method that creates the component and automatically places it inside a JDialog or JInternalFrame. There are eight of these factory methods (two varieties of four methods) that JOptionPane provides:

  • show[Internal]MessageDialog
  • show[Internal]ConfirmDialog
  • show[Internal]InputDialog
  • show[Internal]OptionDialog

The Internal variety creates a JOptionPane and shows it in a JInternalFrame. The other variety creates a JOptionPane and shows it in a JDialog. This tip only discusses the dialog variety.

The message dialog is meant to show a message that the user confirms by selecting the button (or closing the dialog). The message dialog is not meant to return a value.

In its simplest case, you would use code like the following to show a message dialog:

   JOptionPane.showMessageDialog(
      component, "Hello, World");

The system centers the dialog over the component argument.

There are two other variations for showing a message dialog. These allow you to customize the window title, customize the message type (to use the default icon), and set a customized icon:

  • showMessageDialog(Component parentComponent,
    Object message,
    String title,
    int messageType)
  • showMessageDialog(Component parentComponent,
    Object message,
    String title,
    int messageType,
    Icon icon)

The method for showing a confirm dialog has four variations:

  • showConfirmDialog(Component parentComponent,
    Object message)
  • showConfirmDialog(Component parentComponent,
    Object message,
    String title,
    int optionType)
  • showConfirmDialog(Component parentComponent,
    Object message,
    String title,
    int optionType,
    int messageType)
  • showConfirmDialog(Component parentComponent,
    Object message,
    String title,
    int optionType,
    int messageType,
    Icon icon)

The simplest variation brings up a dialog with a question icon. The dialog displays Select an Option as the title, has Yes, No, and Cancel as button labels.

   JOptionPane.showConfirmDialog(component, "Lunch?");

If you don't like the defaults, you can change them by using one of the other methods. You'll find that everything is changeable with JOptionPane.

Unlike the message dialog, the confirm dialog does require a return value. Here, you really do want to know which button the user selected. The confirm dialog returns an integer, indicated by one of the following constants of the JOptionPane class:

  • CANCEL_OPTION
  • CLOSED_OPTION (used when the used closed popup window)
  • NO_OPTION
  • OK_OPTION
  • YES_OPTION

Passing in a setting of OK_CANCEL_OPTION for the option type changes the buttons shown in the confirm dialog to OK and Cancel. Comparing the value returned to the constant, indicates which button the user selected.

Checking for the return value changes the one line above to quite a few more:

   int returnValue = JOptionPane.showConfirmDialog(
     component, "Lunch?");
   String message = null;
   if (returnValue == JOptionPane.YES_OPTION) {
     message = "Yes";
   } else if (returnValue == JOptionPane.NO_OPTION) {
     message = "No";
   } else if (returnValue == JOptionPane.CANCEL_OPTION) {
     message = "Cancel";
   } else if (returnValue == JOptionPane.CLOSED_OPTION) {
     message = "Closed";
   }
   System.out.println("User selected: " + message);

The input dialog method has six variations. Five return a String:

  • showInputDialog(Object message)
  • showInputDialog(Object message,
    Object initialSelectionValue)
  • showInputDialog(Component parentComponent,
    Object message)
  • showInputDialog(Component parentComponent,
    Object message,
    Object initialSelectionValue)
  • showInputDialog(Component parentComponent,
    Object message,
    String title,
    int messageType)

One of the variations returns an Object:

  • showInputDialog(Component parentComponent,
    Object message,
    String title,
    int messageType,
    Icon icon,
    Object[] selectionValues,
    Object initialSelectionValue)

The simplest variation shows the message in a question dialog. The dialog displays Input as the frame title, and has OK and Cancel buttons. Because there is no component provided, the frame is centered over the whole screen.

   String value = JOptionPane.showInputDialog("Name");

As is the case for other types, when you show the input dialog, you can set the parent component, frame title, message type, or icon. However the buttons are fixed at OK and Cancel. You can also set the initial value in the text field.

The last method variation for the input dialog is special. Instead of offering the user a text field to enter selections, you provide an array of objects (typically strings) from which to choose. Depending on how many values you provide, the look and feel will present either a JComboBox or JList for the user selections. Here's an example that uses this variation. Here an input dialog prompts a user to select a day of the week. The default is the last day of the week. The example uses a smallList for the days of the week.

   String smallList[] = {
     "Sunday",
     "Monday",
     "Tuesday",
     "Wednesday",
     "Thursday",
     "Friday",
     "Saturday"
   };
   String value = 
     (String)JOptionPane.showInputDialog(
       component, 
       "Which Day?", 
       "Day", 
       JOptionPane.QUESTION_MESSAGE, 
       null, // Use default icon
       smallList, 
       smallList[smallList.length-1]);
   System.out.println("Day: " + value);

For a larger list, the code looks essentially the same. Here the list of system properties are used as the choices.

   Object largeList[] = 
     System.getProperties().keySet().toArray();
   String value = 
     (String)JOptionPane.showInputDialog(
       component, 
       "Which Property?", 
       "Property", 
      JOptionPane.QUESTION_MESSAGE, 
       null, 
       largeList, 
       largeList[largeList.length-1]);


   System.out.println("Property: " + value);

The final dialog type is an all encompassing one, showOptionDialog. There is only one version of the method. Here, you can set everything:

  • showOptionDialog(Component parentComponent,
    Object message,
    String title,
    int optionType,
    int messageType,
    Icon icon,
    Object[] options,
    Object initialValue)

The only thing new here is the options array. This is how you can customize the set of available buttons. Notice that this is an Object array, not a String array. If the Object is a Component, that component is used in the dialog. This allows you to place icons in the buttons, for instance. More typically, you would provide an array of strings, and their labels would be used as the button labels. The initialValue is then used to select which of the options gets the default selection.

The showOptionDialog method returns an int. This indicates the position selected from the options array. CLOSED_OPTION is still returned if the user closed the dialog.

   String options[] = {"Yes", "Not Now", "Go Away"};
   int value = JOptionPane.showOptionDialog(
       component,
       "Lunch?",
       "Lunch Time",
       JOptionPane.YES_NO_OPTION, // Need something  
         JOptionPane.QUESTION_MESSAGE,
       null, // Use default icon for message type
       options,
       options[1]);
   if (value == JOptionPane.CLOSED_OPTION) {
     System.out.println("Closed window");
   } else {
     System.out.println("Selected: " + options[value]);
   }

If you don't want buttons, pass in an empty array for the options.

Adding Word Wrap

The JOptionPane component has a read-only property (MaxCharactersPerLineCount) for the maximum number of characters per line. By default, this is Integer.MAX_VALUE. By subclassing JOptionPane, you can override this setting. Changing this setting allows the component to word-wrap when a message is really long.

   public static JOptionPane getNarrowOptionPane(
                       int maxCharactersPerLineCount) {
     // Our inner class definition
     class NarrowOptionPane extends JOptionPane {
       int maxCharactersPerLineCount;
       NarrowOptionPane(int maxCharactersPerLineCount) {
         this.maxCharactersPerLineCount = 
           maxCharactersPerLineCount;
       }
       public int getMaxCharactersPerLineCount() {
         return maxCharactersPerLineCount;
       }
     }


     return new NarrowOptionPane(
       maxCharactersPerLineCount);
   }

By subclassing, you can no longer use the static helper methods such as showMessageDialog. Here's how you manually create and show the component:

   String msg = "This is a really long message. ...";
   JOptionPane pane = getNarrowOptionPane(50);
   pane.setMessage(msg);
   pane.setMessageType(JOptionPane.INFORMATION_MESSAGE);
   JDialog dialog = pane.createDialog(
     component, "Width 50");
   dialog.show();

Of course, you can add a "\n" to the message, but then you have to count the characters per line.

Message as Object

At this point you might ask why the message argument to all the showXXXDialog methods is an Object. The answer is that it's because the message argument to all these methods doesn't have to be a String. You can pass in any Object. Each object is "added" to the message area, one on top of the other. For instance, if you pass in an array of two strings, it creates a message on two lines:

   String msg[] = {"Welcome", "Home"};
   JOptionPane.showMessageDialog(component, msg);

The objects you add can be components, icons, or objects. Components are added as such. Icons are shown in a label, as are strings. For other objects, their string representation (toString()) is shown. For instance, the following component can be added to an option pane. As the user changes the selection in the slider, the option pane's value is updated:

   public static JSlider getSlider(
                        final JOptionPane optionPane) {
     JSlider slider = new JSlider();
     slider.setMajorTickSpacing (10);
     slider.setPaintTicks(true);
     slider.setPaintLabels(true);
     ChangeListener changeListener = 
       new ChangeListener() {
       public void stateChanged(
                   ChangeEvent changeEvent) {
         JSlider theSlider = 
             (JSlider)changeEvent.getSource();
         if (!theSlider.getValueIsAdjusting()) {
           optionPane.setInputValue(
             new Integer(theSlider.getValue()));
         }
       }
     };
     slider.addChangeListener(changeListener);
     return slider;
   }

Because you have to pass the option pane to the method, here again, you can't use one of the shortcuts to create the dialog:

   JOptionPane optionPane = new JOptionPane();
   JSlider slider = getSlider(optionPane);
   Object msg[] = {"Select a value:", slider};
   optionPane.setMessage(msg);
   optionPane.setMessageType(
     JOptionPane.QUESTION_MESSAGE);
   optionPane.setOptionType(
     JOptionPane.OK_CANCEL_OPTION);
   JDialog dialog = optionPane.createDialog(
       Options.this, "Select Value");
   dialog.show();
   Object value = optionPane.getValue();
   if (value == null || !(value instanceof Integer)) {
     System.out.println("Closed");
   } else {
     int i = ((Integer)value).intValue();
     if (i == JOptionPane.CLOSED_OPTION) {
       System.out.println("Closed");
     } else if (i == JOptionPane.OK_OPTION) {
       System.out.println("OKAY - value is: " +
                  optionPane.getInputValue());
     } else if (i == JOptionPane.CANCEL_OPTION) {
       System.out.println("Cancelled");
     }
   }

Notice that as you start getting fancier with JOptionPane, you lose the ability to use the shortcut methods. And, you have to do special handling of the return value. You first need to use getValue for the JOptionPane to determine which button the user selected. Then, for when the user presses the OK button, you need to use the getInputValue method to get the value from the underlying slider.

Sounds

Swing provides for auditory cues related to the four types of icons:

  • OptionPane.errorSound
  • OptionPane.informationSound
  • OptionPane.questionSound
  • OptionPane.warningSound

By setting these properties, you can get sounds when your option panes are displayed. You can set the individual sounds with lines like the following:

   UIManager.put("OptionPane.questionSound", 
     "sounds/OptionPaneError.wav");

Or set all of them with the system defaults as follows:

   UIManager.put("AuditoryCues.playList",
     UIManager.get("AuditoryCues.defaultCueList"));

Audio cues are disabled by default because they might have problems on some platforms. It is recommended that you use them with care until the issues have been resolved.

Complete Example

Here is the source code for a complete example that uses the features explored in this tip.

   import javax.swing.*;
   import javax.swing.event.*;
   import java.awt.*;
   import java.awt.event.*;
   import java.util.Locale;

   public class Options extends JFrame {
     private static class FrameShower
         implements Runnable {
       final Frame frame;
       public FrameShower(Frame frame) {
         this.frame = frame;
       }
       public void run() {
         frame.show();
       }
     }

     public static JOptionPane getNarrowOptionPane(
         int maxCharactersPerLineCount) {
       // Our inner class definition
       class NarrowOptionPane extends JOptionPane {
         int maxCharactersPerLineCount;
         NarrowOptionPane(
                   int maxCharactersPerLineCount) {
           this.maxCharactersPerLineCount = 
              maxCharactersPerLineCount;
     }
         public int getMaxCharactersPerLineCount() {
           return maxCharactersPerLineCount;
         }
       }

    return new NarrowOptionPane(
               maxCharactersPerLineCount);
  }

     public static JSlider getSlider(
                        final JOptionPane optionPane) {
       JSlider slider = new JSlider();
       slider.setMajorTickSpacing (10);
       slider.setPaintTicks(true);
       slider.setPaintLabels(true);
       ChangeListener changeListener = 
                            new ChangeListener() {
         public void stateChanged(
                           ChangeEvent changeEvent) {
           JSlider theSlider = (
             JSlider)changeEvent.getSource();
           if (!theSlider.getValueIsAdjusting()) {
             optionPane.setInputValue(new Integer(  
               theSlider.getValue()));
           }
         }
       };
       slider.addChangeListener(changeListener);
       return slider;
     }

     public Options() {
       super("JOptionPane Usage");
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       Container contentPane = getContentPane();
       contentPane.setLayout(new FlowLayout());
       JButton message = new JButton("Message");
       ActionListener messageListener = 
                               new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           JOptionPane.showMessageDialog(
             Options.this, "Hello, World");
         }
       };
       message.addActionListener(messageListener);
       contentPane.add(message);
       JButton confirm = new JButton("Confirm");  
       ActionListener confirmListener = 
        new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           int returnValue = 
             JOptionPane.showConfirmDialog(
           Options.this, "Lunch?");
           String message = null;           
           if (returnValue == JOptionPane.YES_OPTION) {
             message = "Yes";
           } else if (
               returnValue == JOptionPane.NO_OPTION) {
             message = "No";
           } else if (
               returnValue == JOptionPane.CANCEL_OPTION) {
             message = "Cancel";
           } else if (
               returnValue == JOptionPane.CLOSED_OPTION) {
             message = "Closed";
           }
           System.out.println("User selected: " + message);
         }
       };
       confirm.addActionListener(confirmListener);
       contentPane.add(confirm);
       JButton inputText = new JButton("Input Text");
       ActionListener inputTextListener = 
                               new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           String value = 
             JOptionPane.showInputDialog("Name");
           System.out.println("Name: " + value);
         }
       };
       inputText.addActionListener(inputTextListener);
       contentPane.add(inputText);
       JButton inputCombo = new JButton("Input Combo");
       ActionListener inputComboListener = 
                                 new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           String smallList[] = {
             "Sunday",
             "Monday",
             "Tuesday",
             "Wednesday",
             "Thursday",
             "Friday",
             "Saturday"
           };
           String value = 
             (String)JOptionPane.showInputDialog(
             Options.this, "Which Day?", "Day", 
             JOptionPane.QUESTION_MESSAGE, null, 
             smallList, smallList[smallList.length-1]);
           System.out.println("Day: " + value);
         }
       };
       inputCombo.addActionListener(inputComboListener);
       contentPane.add(inputCombo);
       JButton inputList = new JButton("Input List");     
       ActionListener inputListListener = 
                              new ActionListener() {
        public void actionPerformed(ActionEvent e) {
           Object largeList[] = 
             System.getProperties().keySet().toArray();
           String value = 
             (String)JOptionPane.showInputDialog(
             Options.this, "Which Property?", "Property", 
             JOptionPane.QUESTION_MESSAGE, null, 
             largeList, largeList[largeList.length-1]);
             System.out.println("Property: " + value);
         }
       };              
       inputList.addActionListener(inputListListener);
       contentPane.add(inputList);
       JButton all = new JButton("All");
       ActionListener allListener = 
                               new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           String options[] = 
             {"Yes", "Not Now", "Go Away"};
           int value = JOptionPane.showOptionDialog(
               Options.this,
               "Lunch?",
               "Lunch Time",
               JOptionPane.YES_NO_OPTION, 
               // Message type
               JOptionPane.QUESTION_MESSAGE,
               null, // Use default icon for message type
               options,
               options[1]);
           if (value == JOptionPane.CLOSED_OPTION) {
             System.out.println("Closed window");
           } else {
             System.out.println(
               "Selected: " + options[value]);
           }
         }
       };       
       all.addActionListener(allListener);
       contentPane.add(all);
       JButton wide = new JButton("Wide");
       ActionListener wideListener = 
                               new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           String msg = 
             "This is a really long message. " + 
             "This is a really long message. " + 
             "This is a really long message. " + 
             "This is a really long message. " + 
             "This is a really long message. " +
             "This is a really long message.";
           JOptionPane pane = getNarrowOptionPane(50);
           pane.setMessage(msg);
           pane.setMessageType(
             JOptionPane.INFORMATION_MESSAGE);
           JDialog dialog = 
              pane.createDialog(Options.this, "Width 50");
           dialog.show();
         }
       };       
       wide.addActionListener(wideListener);
       contentPane.add(wide);
       JButton twoLine = new JButton("Two Line");
       ActionListener twoLineListener = 
                               new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           String msg[] = {"Welcome", "Home"};
           JOptionPane.showMessageDialog(
             Options.this, msg);
         }
       };       
       twoLine.addActionListener(twoLineListener);
       contentPane.add(twoLine);
       JButton slider = new JButton("Slider");
       ActionListener sliderListener = 
                               new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           JOptionPane optionPane = new JOptionPane();
           JSlider slider = getSlider(optionPane);
           Object msg[] = {"Select a value:", slider};
           optionPane.setMessage(msg);
           optionPane.setMessageType(
             JOptionPane.QUESTION_MESSAGE);
           optionPane.setOptionType(
             JOptionPane.OK_CANCEL_OPTION);
             JDialog dialog = optionPane.createDialog(
                Options.this, "Select Value");
           dialog.show();
           Object value = optionPane.getValue();
           if (value == null || !(value instanceof Integer)) {
             System.out.println("Closed");
           } else {
             int i = ((Integer)value).intValue();
             if (i == JOptionPane.CLOSED_OPTION) {
               System.out.println("Closed");
             } else if (i == JOptionPane.OK_OPTION) {
               System.out.println("OKAY - value is: " +
                          optionPane.getInputValue());
             } else if (i == JOptionPane.CANCEL_OPTION) {
               System.out.println("Cancelled");
             }
           }
         }
       };
       slider.addActionListener(sliderListener);
       contentPane.add(slider);
       setSize(300, 200);
     }
     
     public static void main(String args[]) {
       UIManager.put("AuditoryCues.playList",
         UIManager.get("AuditoryCues.defaultCueList"));
       JFrame frame = new Options();
       Runnable runner = new FrameShower(frame);
       EventQueue.invokeLater(runner);
     }
   }

For additional information about JOptionPane, see the How to Make Dialogs trail in The Java Tutorial and the javadoc for the JOptionPane class.


'자바 > 자바팁' 카테고리의 다른 글

클래스패스 설정  (0) 2010.10.25
Borderlayout 기본설명  (0) 2010.10.21
에코 클라이언트 과정  (0) 2010.10.21
JFrame 관련 팁  (0) 2010.10.18
action event 를 쓸때 컴파일시 inner class 에러 나는 경우  (0) 2010.10.18
★ Top-level component - JFrame ★ - Java/Servlet/JSP

2006/11/28 23:21

복사 http://blog.naver.com/airdasom/90011367478

JFrame
 

'자바 > 자바팁' 카테고리의 다른 글

클래스패스 설정  (0) 2010.10.25
Borderlayout 기본설명  (0) 2010.10.21
에코 클라이언트 과정  (0) 2010.10.21
JDialog 고급활용  (0) 2010.10.18
action event 를 쓸때 컴파일시 inner class 에러 나는 경우  (0) 2010.10.18

addActionListener() 호출시 사용한 new ActionListener() { ... } 부분이

anonymous inner class이고 asd()의 인자인 str을 여기로 고이 전달하려면

str을 final로 선언해야 한다는 얘깁니다.

아래와 같이 final 붙여주면 됩니다.

 

 

class asd extends Frame
{
 public asd(final String str){
  
  setSize(300,200);
  setVisible(true);
  Button bt = new Button("go");
  add(bt);
  bt.addActionListener(new ActionListener(){
   
   public void actionPerformed(ActionEvent e){
    System.out.println(str);
   }

  });

 }

 

'자바 > 자바팁' 카테고리의 다른 글

클래스패스 설정  (0) 2010.10.25
Borderlayout 기본설명  (0) 2010.10.21
에코 클라이언트 과정  (0) 2010.10.21
JDialog 고급활용  (0) 2010.10.18
JFrame 관련 팁  (0) 2010.10.18

//메모장 만들자

import javax.swing.*;
import java.awt.*;

public class NotePadExam extends JFrame
{
 JFrame jf;
 JMenuBar jmb;
 JMenu jm;
 JMenuItem jmt;
 JLabel jlb1;
 JTextArea jta;
 
 public NotePadExam()
 {
  super("메모장");
  try
  {

  setLayout(new FlowLayout());
  jmb = new JMenuBar();
  /*//////////////
  파일메뉴추가
  /*//////////////
  jm = new JMenu("파일");
  
  jm=createMenuItem(jm,"새로만들기");
  jm=createMenuItem(jm,"열기");
  jm=createMenuItem(jm,"저장");
  jm=createMenuItem(jm,"다른이름으로 저장");
  jm=createMenuItem(jm,"끝내기");
  
  jta = new JTextArea(200,200);
  
  //메뉴바추가
  jmb.add(jm);
  /*//////////////
  파일메뉴추가
  /*//////////////

  add(jmb);
  
  //jmb.setSize(50,200);
  //텍스트창추가
  add(jta);
   
  }
  catch (Exception ex)
  {
   System.out.println(ex);
  }
 }
 public JMenu createMenuItem(JMenu jmi,String name2)
 {
  //System.out.println("111111111");
  JMenuItem jmui = new JMenuItem(name2);  
  jmi.add(jmui);
  return jmi;
 }
 public static void main(String[] args)
 {
  NotePadExam npe = new NotePadExam();
  npe.setSize(300,300);
  npe.setVisible(true);

  //System.out.println("Hello World!");
 }
}

awt로 된 완전 초보 계산기입니다..
웹개발만 하다보니 기초자바가 재미있네영..^^;;

import java.awt.*;
import java.awt.event.*;

public class CalcCreateExam extends Frame
{
 Frame f;
 Panel pl_0,pl_1;
 MenuBar mb;
 Menu m1,m2,m3;
 MenuItem menu_exit;
 Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;
 Button bs,ce,bc;
 Button bmc,bmr,bms,bmplus;
 Button bslush,bsq,bminus,bplus;
 Button bresult;
 TextField result_tf;
 // button_al;
 int result_number = 0;
 char ch,privous_ch;
 String str_Result = "";
 String privous_number = "";
 String non_check_number = "";
 String final_result_number = "";

 public CalcCreateExam()
 {
  
  f= new Frame("자바계산기");
  //main = new Panel(new GridLayout());

  pl_0 = new Panel(new GridLayout());
  mb = new MenuBar();
  f.setMenuBar(mb);
  m1=new Menu("편집");
  m2=new Menu("보기");
  m3=new Menu("도움말");

  menu_exit = new MenuItem("나가기");

  mb.add(m1);
  mb.add(m2);
  mb.add(m3);

  m1.add(menu_exit);

  result_tf = new TextField();
  //result_tf.setAlignment();
  //System.out.println();
  
  pl_0.add(result_tf);

  pl_1 = new Panel(new GridLayout(4,4));
  //f = new Frame();
  //result_tf = new TextField(10);
  b1 = new Button("1");
  b2 = new Button("2");
  b3 = new Button("3");
  b4 = new Button("4");
  b5 = new Button("5");
  b6 = new Button("6");
  b7 = new Button("7");
  b8 = new Button("8");
  b9 = new Button("9");
  b0 = new Button("0");
  bc = new Button("C");
  
  bplus = new Button("+");
  bminus = new Button("-");
  bslush = new Button("/");
  bsq = new Button("*");
  //bplus = new Button("+");
  //bplus = new Button("+");
  bresult = new Button("=");//결과버튼
    
  pl_1.add(b9);
  pl_1.add(b8);
  pl_1.add(b7);
  pl_1.add(b6);
  pl_1.add(b5);
  pl_1.add(b4);
  pl_1.add(b3);
  pl_1.add(b2);
  pl_1.add(b1);
  pl_1.add(b0);
  pl_1.add(bplus);
  pl_1.add(bminus);
  pl_1.add(bslush);
  pl_1.add(bsq);
  pl_1.add(bc);
  pl_1.add(bresult);
  
  //pl.setLayout(new GridLayout());
  f.add(pl_1,BorderLayout.CENTER);
  f.add(pl_0,BorderLayout.NORTH);

  //f.add(main);
  
  //이벤트 구현

  ActionListener button_al = new ActionListener()
  {
   public void actionPerformed(ActionEvent ae)
   {
    //System.out.println(ae.getSource().getText());   
    
    
    non_check_number = (String)ae.getActionCommand();

    if(non_check_number.length()==1)
    {
     ch = non_check_number.charAt(0);
     if(Character.isDigit(ch))//숫자인지판단
     {
      str_Result += non_check_number;
      final_result_number = str_Result;
      //System.out.println("!!!!!!!!!!! ++++ : "+str_Result);
     }
     else
     {
      
      switch(ch)
      {       
       case '=':
        Caculate(privous_ch);
        break;
       case 'C':
        privous_number = "";
        str_Result = "";
        //privous_math=new char('');
        non_check_number = "";
        //System.out.println("c");
        break;       
       default :
        privous_ch=ch;
        break;
      }
     
     privous_number = str_Result;
     final_result_number = non_check_number;
     str_Result = "";//초기화
     }    
    }
    
       
   
   //System.out.println("결과창 : " + non_check_number);
   result_tf.setText(final_result_number);
   }

  };//ActionListener
  
  b1.addActionListener(button_al);
  b2.addActionListener(button_al);
  b3.addActionListener(button_al);
  b4.addActionListener(button_al);
  b5.addActionListener(button_al);
  b6.addActionListener(button_al);
  b7.addActionListener(button_al);
  b8.addActionListener(button_al);
  b9.addActionListener(button_al);
  b0.addActionListener(button_al);  
  bresult.addActionListener(button_al);
  bplus.addActionListener(button_al);
  bminus.addActionListener(button_al);
  bslush.addActionListener(button_al);
  bsq.addActionListener(button_al);
  bc.addActionListener(button_al);  
  menu_exit.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent ae)
   {
    System.exit(0);
   }
  });
 }
 public void Caculate(Character ch1)
 {
  //System.out.println("111111111,"+privous_number+","+str_Result);
  int number1 = Integer.parseInt(privous_number);
  int number2 = Integer.parseInt(str_Result);
  //System.out.println("22222222,"+number1+":"+number2);

  switch(ch1)
  {
   case '+' :
    number1+=number2;
    //System.out.println("result : "+number1);
    break;
   case '-' :
    number1-=number2;
    break;
   case '*' :
    number1*=number2;
    break;
   case '/' :
    number1/=number2;
    break;
   
   //default :
    //System.out.println(result_tf.getText());
  }
  //텍스트창에서 안나옴..==;
  non_check_number = Integer.toString(number1);
  
  //System.out.println(number1+math+number2);
 }
 public void CreateFrame()
 {
  
  f.addWindowListener(new WindowAdapter() 
        {
          public void windowClosing(WindowEvent e) 
          {
              System.exit(0);
              
           }
         });

  f.setSize(300,250);
  f.setVisible(true);
  
 }
 public static void main(String[] args)
 {
  CalcCreateExam cce = new CalcCreateExam();
  cce.CreateFrame();
 }
}

완전 허접하다...하지만 조금 더 좋아질 것 같다..ㅋㅋ


1.계산기
2.메모장
3.채팅방
4.등등..

+ Recent posts