로그인 화면 만들기..
여기서는 View단을 구성해보려합니다.
동영상이 화질이 안 좋으실 시, 수동으로 동영상 품질을 설정에서 올려주시면 됩니다.
준비물 : http://adunhansa.tistory.com/156 이미지 파일
오늘 배우는 것 :
JLayered를 통해서 psd를 자바에서 구현하기
컴포넌트 커스터마이징
해야할일 순서
- JFrame상속해서, 세팅
- 레이아웃 잡기 ( JLayeredPane )
- 각각의 패널과 컴포넌트 설정( 이미지패널, 텍스트필드, 버튼)
- 세팅
1.JFrame세팅
public class LoginFrame extends JFrame { // 메인 public static void main(String[] args) { new LoginFrame(); } // 생성자 public LoginFrame() { setTitle("로그인 테스트"); setSize(1600, 900); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //안에 들어갈 내용물들, 레이아웃, 패널설정, 컴포넌트들 setVisible(true); } }
2. 레이아웃 잡기
여기서는 각각의 컴포넌트들을 순서대로 넣어주는 JLayerdPanel을 이용하기로 한다.
// 레이아웃 설정 setLayout(null); JLayeredPane layeredPane = new JLayeredPane(); layeredPane.setBounds(0, 0, 1600, 900); layeredPane.setLayout(null); //마지막 setvisible(true) 바로 위에.. add(layeredPane);
setLayout은 현재 JFrame의 레이아웃설정이다. 여기서 설명을 하자면 상대레이아웃, 보더레이아웃, 카드레이아웃등 많은 레이아웃 형태를 자바에서는 지원하고 있다. 하지만 본 프로그램에서는 이미 PSD로 디자인시안을 잡았기 때문에 절대경로 레이아웃setLayout(null);을 사용하였다.
절대경로에서는 보는바와 같이 안의 컴포넌트들의 가로세로위치, 가로세로길이를 일일이 정해줘야 한다.
패널의 경우는 자신안의 구성물들의 레이아웃을 다시 정할 수 있다.
마지막에는 ADD를 해줘야 한다.
3. 각각의 컴포넌트 설정
전역변수로 이러한 변수들을 설정해준다.
(추후 생성자가 아닌 다른 메소드에서 접근해서 이벤트 처리를 해야 하기 때문)
BufferedImage img = null; JTextField loginTextField; JPasswordField passwordField; JButton bt;
각각 이미지, 텍스트필드, 비밀번호필드, 버튼이다.
이미지 패널 설정
// 패널1 // 이미지 받아오기 try { img = ImageIO.read(new File("img/login.png")); } catch (IOException e) { System.out.println("이미지 불러오기 실패"); System.exit(0); } MyPanel panel = new MyPanel(); panel.setBounds(0, 0, 1600, 900); // 마지막 추가들. //반드시 layeredPane의 제일 마지막에 add해줘야함. layeredPane.add(panel);
//생성자 바깥으로 다음과 같은 내부클래스를 하나 만들어준다. class MyPanel extends JPanel { public void paint(Graphics g) { g.drawImage(img, 0, 0, null); } }
책에 나온 기초 샘플대로 내부클래스로 작업했지만.. 한번만 쓰고 말 경우에는 무명클래스로 내부에서 작업해줘도 됩니다.
텍스트 필드들 설정
// 로그인 필드 loginTextField = new JTextField(15); loginTextField.setBounds(731, 399, 280, 30); layeredPane.add(loginTextField); // 패스워드 passwordField = new JPasswordField(15); passwordField.setBounds(731, 529, 280, 30); layeredPane.add(passwordField); // 로그인버튼 추가 bt = new JButton(new ImageIcon("img/btLogin_hud.png")); bt.setBounds(755, 689, 104, 48); layeredPane.add(bt);
4. 세팅
저대로 실행을 하면 일반적인 스윙이므로 커스터마이징이 필요합니다.
//로그인 내용 loginTextField.setOpaque(false); loginTextField.setForeground(Color.green); loginTextField.setBorder(javax.swing.BorderFactory.createEmptyBorder()); //비밀번호 내용 passwordField.setOpaque(false); passwordField.setForeground(Color.green); passwordField.setBorder(javax.swing.BorderFactory.createEmptyBorder()); // 버튼 투명처리 bt.setBorderPainted(false); bt.setFocusPainted(false); bt.setContentAreaFilled(false);
총 소스
package view; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class LoginFrame extends JFrame { BufferedImage img = null; JTextField loginTextField; JPasswordField passwordField; JButton bt; // 메인 public static void main(String[] args) { new LoginFrame(); } // 생성자 public LoginFrame() { setTitle("로그인 테스트"); setSize(1600, 900); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 레이아웃 설정 setLayout(null); JLayeredPane layeredPane = new JLayeredPane(); layeredPane.setBounds(0, 0, 1600, 900); layeredPane.setLayout(null); // 패널1 // 이미지 받아오기 try { img = ImageIO.read(new File("img/login.png")); } catch (IOException e) { System.out.println("이미지 불러오기 실패"); System.exit(0); } MyPanel panel = new MyPanel(); panel.setBounds(0, 0, 1600, 900); // 로그인 필드 loginTextField = new JTextField(15); loginTextField.setBounds(731, 399, 280, 30); layeredPane.add(loginTextField); loginTextField.setOpaque(false); loginTextField.setForeground(Color.green); loginTextField.setBorder(javax.swing.BorderFactory.createEmptyBorder()); // 패스워드 passwordField = new JPasswordField(15); passwordField.setBounds(731, 529, 280, 30); passwordField.setOpaque(false); passwordField.setForeground(Color.green); passwordField.setBorder(javax.swing.BorderFactory.createEmptyBorder()); layeredPane.add(passwordField); // 로그인버튼 추가 bt = new JButton(new ImageIcon("img/btLogin_hud.png")); bt.setBounds(755, 689, 104, 48); // 버튼 투명처리 bt.setBorderPainted(false); bt.setFocusPainted(false); bt.setContentAreaFilled(false); layeredPane.add(bt); // 마지막 추가들 layeredPane.add(panel); add(layeredPane); setVisible(true); } class MyPanel extends JPanel { public void paint(Graphics g) { g.drawImage(img, 0, 0, null); } } }