JLabel이란?
- JLabel 클래스는 JComponent 클래스를 상속하며, JLabel 객체는 GUI 화면에 텍스트 안내문이나 정보를 표시하는 역할을 합니다.
- JLabel은 한 줄의 읽기 전용 텍스트, 이미지, 또는 텍스트와 이미지를 함께 표시할 수 있습니다.
- JLabel의 주요 메서드로는 setText(), setIcon(), setBackground(), setOpaque(), setHorizontalAlignment(), setVerticalAlignment() 등이 있습니다.
- JLabel은 PropertyChangeListener 인터페이스를 명시적으로 발생시킬 수도 있습니다.
JLabel은 기본적으로 편집 기능을 제공하지 않지만, CardLayout과 JTextField를 조합하면 클릭 시 편집 모드로 전환되는 편집 가능한 레이블을 손쉽게 만들 수 있습니다. 핵심 아이디어는 다음과 같습니다.
- 마우스 커서가 JLabel 위에 진입하면(mouseEntered) 현재 텍스트를 JTextField에 복사한 뒤 카드를 전환하여 편집 상태로 바꿉니다.
- 마우스 커서가 JTextField에서 벗어나면(mouseExited) 수정된 텍스트를 JLabel에 반영하고 다시 레이블 화면으로 되돌아갑니다.
이렇게 하면 사용자에게는 하나의 요소처럼 보이면서도, 필요할 때만 텍스트를 수정할 수 있는 직관적인 UI를 구현할 수 있습니다.
예제 코드
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.*;
public class JEditableLabel extends JFrame {
public JEditableLabel() {
setTitle("JEditableLabel");
setLayout(new FlowLayout());
final JLabel label = new JLabel(" Welcome to Tutorials Point");
final JTextField textfield = new JTextField();
final CardLayout cl = new CardLayout();
final JPanel panel = new JPanel(cl);
panel.add(label, "label component");
panel.add(textfield, "textfield component");
add(panel);
label.addMouseListener(new MouseAdapter() {
public final void mouseEntered(MouseEvent evt) {
textfield.setText(label.getText());
cl.show(panel, "textfield component");
}
});
textfield.addMouseListener(new MouseAdapter() {
public final void mouseExited(MouseEvent evt) {
label.setText(textfield.getText());
cl.show(panel, "label component");
}
});
setSize(375, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new JEditableLabel();
}
}위 코드에서는 JPanel에 CardLayout을 적용해 JLabel과 JTextField 두 개의 컴포넌트를 겹쳐 놓고, MouseAdapter의 이벤트에 따라 두 컴포넌트 사이를 전환합니다. 이를 통해 레이블이 마치 인라인 편집이 가능한 것처럼 동작하게 됩니다.
실행 결과
