JTextField, JTextArea에서 한글 입력 방법


[ Follow Ups ] [ Post Followup ] [ 자바 묻고 답하기 ]

Posted by 김덕태 on November 29, 1997 at 17:57:39:

In Reply to: 스윙에서 한글입력... posted by 하동욱 on November 26, 1997 at 11:58:54:


그렇게 할 수도 있겠지만 다음과 같이 하면 .dll 화일을 바꾸지 않고
JTextField, JTextArea 스윙 컴포넌트에서 한글을 입력할 수 있습니다.
JDK 1.1.4 윈도우즈 버전의 TextField와 TextArea 컴포넌트가
한글 키 이벤트를 발생시키는 특성을 응용한 것입니다.
(솔라리스 버전에서는 한글 키 이벤트를 발생시키지 않기 때문에 안되더군요.)


다음 화일에 포함되는 새로 정의된 클래스 JTextField와 JTextArea는
기존의 스윙 클래스 JTextField와 JTextArea를 같은 클래스 이름을 갖는
다른 클래스 정의로 대치하여 한글 입력이 되도록 한 것입니다.


이 프로그램을 JTextField나 JTextArea를 사용하는 프로그램이
있는 디렉토리에 컴파일 해놓거나 해당 원시 화일에 포함시킨후,
다시 컴파일하면 기존 소스 코드의 수정없이 한글을 입력할 수 있습니다.


실행 절차:


C:\example\swing> set CLASSPATH=.;C:\swing-0.5.1\swing.jar
C:\example\swing> javac JTextNativeInputTest.java
C:\example\swing> java JTextNativeInputTest



Notepad.java의 실행 절차:


C:\swing-0.5.1\examples\Notepad> set CLASSPATH=.;C:\swing-0.5.1\swing.jar
(JTextNativeInputTest.java를 이곳으로 복사...)
C:\swing-0.5.1\examples\Notepad> javac JTextNativeInputTest.java
(Notepad.java에서 한글이 출력될 수 있도록
다음과 같이 수정한다.
// editor.setFont(new Font("Courier", Font.PLAIN, 12));
// ===>
editor.setFont(new Font("Monospaced", Font.PLAIN, 12));
)
C:\swing-0.5.1\examples\Notepad> javac Notepad.java
C:\swing-0.5.1\examples\Notepad> java Notepad



====================== JTextNativeInputTest.java ===================


import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;


class JTextField extends com.sun.java.swing.JTextField
{
public JTextField()
{ addFocusListener( focusHandler );
input.addFocusListener( inputFocusHandler );
input.addKeyListener( inputKeyHandler );
add( input );
}


TextField input = new TextField()
{ // TextField가 보이지 않도록 크기를 0으로 만든다.
public Dimension getPreferredSize()
{ return new Dimension(0,0);
}
public Dimension getMaximumSize()
{ return new Dimension(0,0);
}
};


FocusListener focusHandler = new FocusAdapter()
{ public void focusGained( FocusEvent ev )
{ input.requestFocus(); // 포커스를 TextField로 전송
}
};


FocusListener inputFocusHandler = new FocusListener()
{ public void focusGained( FocusEvent ev )
{ getCaret().setVisible( true ); // 캐럿이 계속 보이게 한다.
}
public void focusLost( FocusEvent ev )
{ getCaret().setVisible( false ); // 캐럿이 보이지 않게 한다.
}
};


// TextField에서 발생한 키 이벤트를 가져온다.
KeyListener inputKeyHandler = new KeyListener()
{ public void keyPressed( KeyEvent ev )
{ dispatchEvent( ev );
}
public void keyTyped( KeyEvent ev )
{ input.setText("");
dispatchEvent( ev );
}
public void keyReleased( KeyEvent ev )
{ dispatchEvent( ev );
}
};
}



class JTextArea extends com.sun.java.swing.JTextArea
{
public JTextArea()
{ addFocusListener( focusHandler );
input.addFocusListener( inputFocusHandler );
input.addKeyListener( inputKeyHandler );
add( input );
}


TextArea input = new TextArea()
{ // TextArea가 보이지 않도록 크기를 0으로 만든다.
public Dimension getPreferredSize()
{ return new Dimension(0,0);
}
public Dimension getMaximumSize()
{ return new Dimension(0,0);
}
};


FocusListener focusHandler = new FocusAdapter()
{ public void focusGained( FocusEvent ev )
{ input.requestFocus(); // 포커스를 TextArea로 전송
}
};


FocusListener inputFocusHandler = new FocusListener()
{ public void focusGained( FocusEvent ev )
{ getCaret().setVisible( true ); // 캐럿이 계속 보이게 한다.
}
public void focusLost( FocusEvent ev )
{ getCaret().setVisible( false ); // 캐럿이 보이지 않게 한다.
}
};


// TextArea에서 발생한 키 이벤트를 가져온다.
KeyListener inputKeyHandler = new KeyListener()
{ public void keyPressed( KeyEvent ev )
{ dispatchEvent( ev );
}
public void keyTyped( KeyEvent ev )
{ input.setText("");
dispatchEvent( ev );
}
public void keyReleased( KeyEvent ev )
{ dispatchEvent( ev );
}
};
}


class JTextNativeInputTest
{
public static void main( String[] args )
{
JFrame f = new JFrame();
f.getContentPane().setLayout( new BorderLayout() );


JTextField tf = new JTextField();
f.getContentPane().add( tf, "North" );


JScrollPane scroller = new JScrollPane();
scroller.setBorder( BorderFactory.createLoweredBevelBorder() );
JTextArea ta = new JTextArea();
scroller.setViewportView( ta );


f.getContentPane().add( scroller, "Center" );
f.setSize(200, 300);
f.setVisible( true );
}
}


--
Deogtae Kim (김덕태)
CA Lab. CS Dept. KAIST
http://calab.kaist.ac.kr/~dtkim





Follow Ups:



이어서 글올리기(답하기)

이름:
E-Mail:
제목:
내용:
관련 URL(선택):
URL 제목(선택):
관련 이미지 URL:


[ Follow Ups ] [ Post Followup ] [ 자바 묻고 답하기 ]