Download presentation
Presentation is loading. Please wait.
1
Java Seminar 5
2
Image 그리기
3
Image 그리기 Panel이 존재 Panel에 그림을 그린다. Panel을 도화지라고 생각하자.
4
JPanel을 익명클래스로 상속한후 paintComponent를 오버라이딩한다.
Image 그리기 JPanel pn = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); ImageIcon ii = new ImageIcon("panda.jpg"); Image img = ii.getImage(); g.drawImage(img, 10, 10, this); } }; JPanel을 익명클래스로 상속한후 paintComponent를 오버라이딩한다.
5
Image 그리기 JPanel pn = new JPanel() { @Override
protected void paintComponent(Graphics g) { super.paintComponent(g); ImageIcon ii = new ImageIcon("panda.jpg"); Image img = ii.getImage(); g.drawImage(img, 10, 10, this); } }; ImageIcon으로 외부 이미지 파일을 불러온다. ImageIcon은 Image로 다시 이미지화 시켜준다. 그 다음 Graphics의 drawImage를 사용해서 구현시켜 준다. drawImage의 4파라메터는 이미지,x좌표,y좌표,구현시킬 위치로 선택한다.
6
Image 그리기 public class Main { public static void main(String[] args) {
JFrame fr = new JFrame("This 프레임"); JPanel pn = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); ImageIcon ii = new ImageIcon("panda.jpg"); Image img = ii.getImage(); g.drawImage(img, 10, 10, this); } }; fr.setContentPane(pn); fr.setSize(500, 500); fr.setVisible(true); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
7
Image 그리기 그림 파일은 프로젝트에 위치시킨다.
8
Image 그리기 원본 그림이 더크면 나머지 부분은 잘리게된다. 더 확인하고 싶으면 프레임을 키워보자. 10,10만큼 띄어짐
9
출력할그림,x좌표,y좌표,가로,세로,배치할 컴포넌트가 된다.
Image 그리기 JPanel pn = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); ImageIcon ii = new ImageIcon("panda.jpg"); Image img = ii.getImage(); g.drawImage(img, 0, 0, 300, 300, this); } }; 위처럼 파라메터가 6개인걸 선택하면 출력할그림,x좌표,y좌표,가로,세로,배치할 컴포넌트가 된다.
10
Image 그리기
11
Image 그리기 @Override protected void paintComponent(Graphics g) {
super.paintComponent(g); ImageIcon ii = new ImageIcon("panda.jpg"); Image img = ii.getImage(); g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this); } this는 자기자신이므로 여기서는 익명클래스 Jpanel을 의미한다. 위와 같이 코드를 짜게되면 화면(Panel)의 크기대로 그림을 정할 수 있다.
12
Image 그리기 프레임의 크기를 늘렸다 줄였다 한번 해보자.
13
Image 그리기 @Override protected void paintComponent(Graphics g) {
super.paintComponent(g); ImageIcon ii = new ImageIcon("panda.jpg"); Image img = ii.getImage(); g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this); System.out.println("paint호출 순간!"); } paintComponent는 우리가 명시적이게 호출하는게 아니라 콜백(대리호출)에의해서 호출하게된다. 그럼 어느 타이밍에 이 메소드가 실행될까? 창을 늘렸다,줄였다 하면서 확인해보자.
14
Image 그리기 public class Main { public static int x;
public static int y; public static void main(String[] args) { JFrame fr = new JFrame("This 프레임"); JPanel pn = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); ImageIcon ii = new ImageIcon("panda.jpg"); Image img = ii.getImage(); g.drawImage(img, x, y, this.getWidth(), this.getHeight(), this); } }; fr.addKeyListener(new KeyListener() { public void keyTyped(KeyEvent e) { public void keyReleased(KeyEvent e) {
15
Image 그리기 동작하지는 않는다. 그 이유는 뭘까? @Override
public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: x-=10; break; case KeyEvent.VK_RIGHT: x+=10; case KeyEvent.VK_UP: y-=10; case KeyEvent.VK_DOWN: y+=10; } }); fr.setContentPane(pn); fr.setSize(500, 500); fr.setVisible(true); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 동작하지는 않는다. 그 이유는 뭘까?
16
Image 그리기 @Override public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: x-=10; pn.repaint(); break; case KeyEvent.VK_RIGHT: x+=10; case KeyEvent.VK_UP: y-=10; case KeyEvent.VK_DOWN: y+=10; }
17
Swing 문제
18
Swing 문제 1 컨탠트팬에 하나의 레이블이 달려있다. 레이블은 컨탠트 팬의 전체를 차지한다. 컨탠트 팬은 흰색(255,255,255)이다. 일반적으로 레이블은 포커스를 얻지 못한다. 따라서 클릭을 하면 포커스를 얻도록 수정하라. 그리고 키를 타이핑하면 레이블에 표시되도록 하라. 대신 백스페이스를 누를 경우 쓴 글자가 지워지게 하라. 프레임 크기는 500*500이다.
19
Swing 문제 1 힌트 1.다른 레이아웃을 쓰면 레이블이 화면 전체를 가리지 못한다. 단 그리드레이아웃의 경우에는 무조건 비율에 비례하므로 1행 1열짜리를 만들면 전체를 채울 수 있다. 2.특정 컴포넌트에 강제로 포커스를 주는 메소드는 requestFocus라는 메소드이다. 3.백스페이스는 일종의 타이핑으로 취급되므로 keytyped메소드에서 콜백된다.e.getKeyChar()==KeyEvent.VK_BACK_SPACE라는 구문을 사용해서 true면 백스페이스를 누른 것이다.
20
Swing 문제 2 컨탠트팬은 총 5구역으로 나눠져 있다. 그 중에서 2구역에는 체크박스가 3개 존재하고 3구역에서는 라디오버튼이 두개 존재한다. 라디오버튼은 두개 동시에 누를 수 없다. 마지막 5구역의 버튼을 눌렀을 경우 4구역의 결과에 체크한 결과가 다음과 같이 뜨게 하라. 프레임의 크기는 500*500이다.
21
Swing 문제 2 사용한 언어가 없다면 왼쪽과 같이 뜨게 하라.
22
Swing 문제 2 사용한 언어가 있다면 왼쪽과 같이 뜨게 하라.
23
Swing 문제 2 힌트 1.총 5구역이 균등하게 분할되어 있으므로 gridlayout으로 5구역 분할해서 사용하는게 바람직하다. 2구역과 3구역은 여러 개의 컴포넌트가 들어가는데 flowlayout으로 하는게 깔끔하게 보기좋다. 2.라디오 버튼은 그냥두는게아니라 ButtonGroup으로 묶어야 둘중 하나만 선택이 된다. ButtonGroup클래스로 둘을 묶어주어라. 예제가 필요하다면 블로그를 확인하라. 3.결과에 사용할 문자열은 두번 세번 작동을 해도 그 결과가 나오게 해야한다. 첫번째 버튼을 눌렀을때 제대로 작동하고 두번째 버튼을 눌렀을 때도 제대로 작동해야한다.
24
Swing 문제 3
25
Swing 문제 3 프레임의 크기는 900*500이다. 총 3구역이 있고 3구역의 비율은 같다. 왼쪽은 list이며 가운데는 3가지의 레이블을 가지고 있고 3가지의 레이블의 간격은 동일하다. 마지막 구역은 3개의 레이블과 3개의 텍스트필드, 그리고 버튼이 4칸짜리 구역에 각각 배치되어있다. 텍스트필드에 각각 값을 집어넣으면 Person클래스(이름,성별,나이)에 값이 저장된다. 그리고 그 Person클래스는 배열로 만들어져있고 추가 즉시 리스트는 갱신된다. 리스트에 목록을 누르면 다시 이름과 성별 나이가 출력되게 하라.
26
Swing 문제 3
27
Swing 문제 3
28
Swing 문제 3 힌트 1.배열은 일일히 늘리기 귀찮으므로 100개를 잡고 만들어라. 보여주는 리스트 목록은 문자열 배열만 가능하므로 문자열 배열을 100칸으로 같이 만들어준다. 배열은 이미 크기를 100칸으로 잡아서 length로 확인이 불가능하므로 따로 count라는 변수를 둬서 크기를 관리하라. 2.패널들은 레이아웃을 gridlayout을 적극활용하면 배치에는 큰 문제가 없다. 3.텍스트 필드의 경우 안에 아무것도 안적으면 텍스트필드의 크기가 현저히 작다. 이때 생성자안에 숫자를 집어넣으면 그 숫자만큼 길어진다. 예를들어 new JTextField(10)같은 형식으로 사용하면된다. 4.내가 배열에 새로 값을 추가시켜도 GUI에 바로 반영되지 않는다. 따라서 다시 반영시켜줄 필요가 있다.
Similar presentations