본문 바로가기

BackEnd/Java

[java]이것이 자바다 부록 Java UI 6 (Swing을 이용한 텍스트 컴포넌트)

728x90
반응형

1. 텍스트 컴포넌트

   ▷ 텍스트를 나타내거나 편집할 수 있는 컴포넌트를 말함

   ▷ JLabel, JTextField, JPasswordField, JTextArea, JEditorPane, JTextPane 등이 있음

   ▷ JLabel만 텍스트를 편집할 수 없고, 나머지는 텍스트를 편집할 수 있음

   ▷ 편집 가능한 텍스트 컴포넌트는 모두 JTextComponent를 상속받아 각 컴포넌트의 특징에 맞게 설계됨

   ▷ 단일 라인 텍스트 편집 : TextField, JPasswordField, 멀티라인 편집 : JTextArea, JEditorPane, JTextPane

 

(1) JLabel

   ▷ JLabel은 편집할 수 없는 한 줄의 간단한 텍스트와 정적인 이미지를 보여주는 컴포넌트

   ▷ 텍스트와 이미지의 배치는 정렬과 위치 그리고 간격으로 조절 가능

   ▷ 정렬 : JLabel 전체 내용물의 위치, 위치 : 이미지와 텍스트 사이의 상대적인 위치, 간격 : 텍스트와 이미지의 간격

   ▷ JLabel의 경계선은 기본적으로 없음, 경계선의 모양을 주고 싶다면 setBorder() 메소드를 사용

   ▷ 조각칼로 판 모양의 경계를 사용하고 싶다면 EtchedBorder 지정

   ▷ JLabel은 마우스로 클릭할 수 없고, 키보드로 편집할 수도 없으므로 특별한 이벤트가 발생하지 않음

 

 

◎ JLabel 예제 1

import java.awt.GridLayout;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.border.EtchedBorder;

public class JLabelExample extends JFrame {
	private JLabel jLabel1, jLabel2, jLabel3 ,jLabel4;
	
	// 메인 윈도우 설정
	public JLabelExample() {
		this.setTitle("JLabelExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().setLayout(new GridLayout(4,1));

		this.getContentPane().add(getJLabel1());
		this.getContentPane().add(getJLabel2());
		this.getContentPane().add(getJLabel3());
		this.getContentPane().add(getJLabel4());
		this.setSize(200,300);
	}
	
	// JLabel 생성 : 텍스트 좌측 정렬, EtcheBorder 적용
	public JLabel getJLabel1() {
		if(jLabel1 == null) {
			jLabel1 = new JLabel();
			jLabel1.setText("JLabel1");
			jLabel1.setHorizontalAlignment(JLabel.LEFT);
			jLabel1.setBorder(new EtchedBorder());
		}
		return jLabel1;
	}
	
	// JLabel 생성 : 이미지 추가, 내용물 중앙 정렬
	public JLabel getJLabel2() {
		if(jLabel2 == null) {
			jLabel2 = new JLabel();
			jLabel2.setText("JLabel2");
			jLabel2.setIcon(new ImageIcon(getClass().getResource("user.gif")));
			jLabel2.setHorizontalAlignment(JLabel.CENTER);
			jLabel2.setBorder(new EtchedBorder());
		}
		return jLabel2;
	}
	
	// JLabel 생성 : 이미지 왼쪽에 텍스트가 오도록 설정
	public JLabel getJLabel3() {
		if(jLabel3 == null) {
			jLabel3 = new JLabel();
			jLabel3.setText("JLabel3");
			jLabel3.setIcon(new ImageIcon(getClass().getResource("user.gif")));
			jLabel3.setHorizontalAlignment(JLabel.CENTER);
			jLabel3.setHorizontalTextPosition(JLabel.LEFT);
			jLabel3.setBorder(new EtchedBorder());
		}
		return jLabel3;
	}
	
	
	// JLabel 생성 : 텍스트 좌측 정렬, EtcheBorder 적용
	public JLabel getJLabel4() {
		if(jLabel4 == null) {
			jLabel4 = new JLabel();
			jLabel4.setText("JLabel4");
			jLabel4.setIcon(new ImageIcon(getClass().getResource("user.gif")));
			jLabel4.setHorizontalAlignment(JLabel.CENTER);
			jLabel4.setBorder(new EtchedBorder());
		}
		return jLabel4;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JLabelExample jFrame = new JLabelExample();
				jFrame.setVisible(true);
			}
		});
	}
}

 

 

 JLabel 예제 2(application window를 통한 화면 생성 예제)

import java.awt.EventQueue;

import javax.swing.JFrame;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.ImageIcon;

public class JLabelExample2 {

	private JFrame frame;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JLabelExample2 window = new JLabelExample2();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public JLabelExample2() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(new GridLayout(4, 1, 0, 0));
		
		JLabel jLabel1 = new JLabel("JLabel1");
		jLabel1.setHorizontalAlignment(SwingConstants.LEFT);
		frame.getContentPane().add(jLabel1);
		jLabel1.setBorder(new EtchedBorder());
		
		JLabel jLabel2 = new JLabel("JLabel2");
		jLabel2.setIcon(new ImageIcon(JLabelExample2.class.getResource("/textcomponent/user.gif")));
		jLabel2.setHorizontalAlignment(SwingConstants.CENTER);
		frame.getContentPane().add(jLabel2);
		jLabel2.setBorder(new EtchedBorder());
		
		JLabel jLabel3 = new JLabel("JLabel3");
		jLabel3.setIcon(new ImageIcon(JLabelExample2.class.getResource("/textcomponent/user.gif")));
		jLabel3.setHorizontalAlignment(SwingConstants.CENTER);
		jLabel3.setHorizontalTextPosition(JLabel.LEFT);
		frame.getContentPane().add(jLabel3);
		jLabel3.setBorder(new EtchedBorder());
		
		JLabel jLabel4 = new JLabel("JLabel4");
		jLabel4.setIcon(new ImageIcon(JLabelExample2.class.getResource("/textcomponent/user.gif")));
		jLabel4.setHorizontalAlignment(SwingConstants.CENTER);
		frame.getContentPane().add(jLabel4);
		jLabel4.setBorder(new EtchedBorder());
	}
}

 

(2) JTextField와 JPasswordField

   ▷ JTextField와 JPasswordField는 단일 라인의 텍스트 입력란을 제공하는 컴포넌트

   ▷ JPasswordField는 사용자의 입력을 다른 사람이 볼 수 없도록 숨긴다는 차이가 있음

 

   ▷ JTextField : getText( ) 메소드, JPasswordField : getPassword ( ) 메소드

   ▷ getText( ) : String 타입으로 리턴, getPassword() : char[ ] 배열로 리턴, 따라서 String 타입 변환 필요

 

◎ 아이디 입력이 알파벳인지, ENTER키 누르면 입력한 패스드를 보여주는 예제

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JTextFieldPasswordFieldExample extends JFrame {
	private JTextField txtId;
	private JPasswordField txtPassword;
	
	// 메인 윈도우 설정
	public JTextFieldPasswordFieldExample() {
		this.setTitle("JTextField & JPasswordField");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().setLayout(new GridLayout(2, 2));
		this.getContentPane().add(new JLabel("아이디", JLabel.CENTER));
		this.getContentPane().add(getTxtId());
		this.getContentPane().add(new JLabel("패스워드", JLabel.CENTER));
		this.getContentPane().add(getTxtPassword());
		this.setSize(200, 100);
	}
	
	// getTxtId JTextField 생성
	public JTextField getTxtId() {
		if(txtId == null) {
			txtId = new JTextField();
			txtId.addKeyListener(new KeyAdapter(){
				public void keyPressed(KeyEvent e){
					if(e.getKeyCode() >= KeyEvent.VK_A && e.getKeyCode()<=
							KeyEvent.VK_Z) {
						JOptionPane.showMessageDialog
						(JTextFieldPasswordFieldExample.this, "알파벳 이군요");
					} else {
						JOptionPane.showMessageDialog
						(JTextFieldPasswordFieldExample.this, "알파벳이 아니군요");
					}
				}
			});
		}
		return txtId;
	}
	
	// JPasswordField 생성
	public JPasswordField getTxtPassword() {
		if(txtPassword == null) {
			txtPassword = new JPasswordField();
			txtPassword.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					String password = new String(txtPassword.getPassword());
					JOptionPane.showMessageDialog
						(JTextFieldPasswordFieldExample.this, "입력한 패스워드: " +
					password);
				}
			});
		}
		return txtPassword;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTextFieldPasswordFieldExample jFrame = 
						new JTextFieldPasswordFieldExample();
				jFrame.setVisible(true);
			}
		});
	}
}

 

 

 

(2) JTextArea

   ▷ 멀티 라인의 텍스트를 편집할 수 있는 컴포넌트, 자체적으로 스크롤을 제공하지 않으므로 JScrollPane에 추가해서 사용

   ▷ 키보드로 텍스트를 편집할 경우에는 스크롤이 따라 움직임, 프로그램에 의해 편집될 경우 스크롤이 따라 움직이지 않음

 

◎ JTextArea를 이용한 예제 1(전송 버튼을 누르면 값이 창에 입력됨)

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JTextAreaExample extends JFrame{
	private JTextArea txtDisplay;
	private JPanel pSouth;
	private JTextField txtInput;
	private JButton btnSend;
	
	public JTextAreaExample() {
		this.setTitle("JTextAreaExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(new JScrollPane(getTxtDisplay()),
				BorderLayout.CENTER);
		this.getContentPane().add(getPSouth(), BorderLayout.SOUTH);
		this.setSize(300, 200);
	}
	
	public JTextArea getTxtDisplay() {
		if(txtDisplay == null) {
			txtDisplay = new JTextArea();
			txtDisplay.setEditable(false);
		}
		return txtDisplay;
	}
	
	public JPanel getPSouth() {
		if(pSouth == null) {
			pSouth = new JPanel();
			pSouth.setLayout(new BorderLayout());
			pSouth.add(getTxtInput(), BorderLayout.CENTER);
			pSouth.add(getBtnSend(), BorderLayout.EAST);
		}
		return pSouth;
	}
	
	public JTextField getTxtInput() {
		if(txtInput == null) {
			txtInput = new JTextField();
		}
		return txtInput;
	}
	
	public JButton getBtnSend() {
		if(btnSend == null) {
			btnSend = new JButton();
			btnSend.setText("전송");
			btnSend.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					getTxtDisplay().append(getTxtInput().getText() + "\n");
					getTxtInput().setText("");
				}
			});
		}
		return btnSend;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTextAreaExample jFrame = new JTextAreaExample();
				jFrame.setVisible(true);
			}
		});
	}
}

 

 

 JTextArea를 이용한 예제 2(엔터키를 누르면 값이 창에 입력됨)

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JTextAreaExample3 extends JFrame{
	private JTextArea txtDisplay;
	private JPanel pSouth;
	private JTextField txtInput;
	private JTextField btnSend;
	
	public JTextAreaExample3() {
		this.setTitle("JTextAreaExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(new JScrollPane(getTxtDisplay()),
				BorderLayout.CENTER);
		this.getContentPane().add(getPSouth(), BorderLayout.SOUTH);
		this.setSize(300, 200);
	}
	
	public JTextArea getTxtDisplay() {
		if(txtDisplay == null) {
			txtDisplay = new JTextArea();
			txtDisplay.setEditable(false);
		}
		return txtDisplay;
	}
	
	public JPanel getPSouth() {
		if(pSouth == null) {
			pSouth = new JPanel();
			pSouth.setLayout(new BorderLayout());
			pSouth.add(getTxtInput(), BorderLayout.EAST);
			pSouth.add(getBtnSend(), BorderLayout.CENTER);
		}
		return pSouth;
	}
	
	public JTextField getTxtInput() {
		if(txtInput == null) {
			txtInput = new JTextField();
		}
		return txtInput;
	}
	
	public JTextField getBtnSend() {
		if(btnSend == null) {
			btnSend = new JTextField();
//			btnSend.setText("전송");
			btnSend.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					getTxtDisplay().append(getBtnSend().getText() + "\n");
					getBtnSend().setText("");
				}
			});
		}
		return btnSend;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTextAreaExample3 jFrame = new JTextAreaExample3();
				jFrame.setVisible(true);
			}
		});
	}
}​


 

 JTextArea를 이용한 예제 3(버튼과 엔터키를 사용하면 값이 창에 입력됨)

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JTextAreaExample2 extends JFrame{
	private JTextArea txtDisplay;
	private JPanel pSouth;
	private JTextField txtInput;
	private JButton btnSend;
	
	public JTextAreaExample2() {
		this.setTitle("JTextAreaExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(new JScrollPane(getTxtDisplay()),
				BorderLayout.CENTER);
		this.getContentPane().add(getPSouth(), BorderLayout.SOUTH);
		this.setSize(300, 200);
	}
	
	public JTextArea getTxtDisplay() {
		if(txtDisplay == null) {
			txtDisplay = new JTextArea();
			txtDisplay.setEditable(false);
		}
		return txtDisplay;
	}
	
	public JPanel getPSouth() {
		if(pSouth == null) {
			pSouth = new JPanel();
			pSouth.setLayout(new BorderLayout());
			pSouth.add(getTxtInput(), BorderLayout.CENTER);
			pSouth.add(getBtnSend(), BorderLayout.EAST);
		}
		return pSouth;
	}
	
	public JTextField getTxtInput() {
		if(txtInput == null) {
			txtInput = new JTextField();
			txtInput.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					getTxtDisplay().append(getTxtInput().getText() + "\n");
					getTxtInput().setText("");
				}
			});
		}
		return txtInput;
	}
	
	public JButton getBtnSend() {
		if(btnSend == null) {
			btnSend = new JButton();
			btnSend.setText("전송");
			btnSend.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					getTxtDisplay().append(getTxtInput().getText() + "\n");
					getTxtInput().setText("");
				}
			});
		}
		return btnSend;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JTextAreaExample2 jFrame = new JTextAreaExample2();
				jFrame.setVisible(true);
			}
		});
	}
}

 



 

JLabel, JTextArea 등을 이용해서 창에 텍스트를 변경해주거나 텍스트 값을 입력할 수 있도록 만들어보았습니다!

 

입출력은 중요한 부분 중 하나인데 잘 알아둬야겠어요!! 더 많은 기능들에 대해서 배워볼게요~!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

 

728x90
반응형