private JLabel x1L, y1L, x2L, y2L, z1L, z2L;
private JTextField x1T, y1T, x2T, y2T, z1T, z2T;
private JCheckBox fill;
private JRadioButton line, circle, rect, roundRect, pen;
private JComboBox<String> combo;
private JButton draw;
private Drc canvas;
우선 기본적으로 필요한 필드를 작성한다
이런 모양의 그림판을 만들거다
![]() |
우선 창을 만든다 setD~ 저건 종료에 대한 디폴드메소드이다. |
![]() |
그림판의 윗부분에 해당하는 메뉴들을 만든다. 그림을 그려서 얻을 좌표를 기록하는 라벨과 텍스트를 만들고 Panel을 만들어 패널에 올린다. JPanel과 그냥 Panel은 비슷하다. |
![]() |
그리고 아래부분에 대한 필드를 생성하고 JPanel에 담는다 ButtonGroup는 라디오 버튼이 중복으로 눌리지 않게 해주는 메소드이다. 색은 배열에 담고 JComboBox를 이용해 세로로 나열하게 만든다. |
![]() |
그다음 컨테이너에 담아서 출력하면 |
![]() |
가운데는 비어있는 그림판 틀이 완성된다 가운데에 그림을 그릴 공간은 canvas로 만들어야 하는데 위에 필드를 보면 Drc canvas가 있다. canvas는 다른 클래스를 만들어 연결할 거니깐 일단 Drc클래스를 만들자 |
![]() |
클래스를 만들고 Canvas를 상속하고 기본생성자를 만든다 근데 메인메소드가 있는 Ex클래스에 연결을 해야한다. Ex클래스에는 private Drc canvas; 필드를 만들었기 때문에 canvas로 연결이 되었다. 1.정보를 오갈 수 있게 Drc클래스에 Ex의 필드?를 만들고 2.Ex클래스에서 보낸 정보를 Drc가 받을 수 있게 만들자 |
![]() |
Ex클래스에서 만든 private Drc canvas; 처럼 private Ex ex를 만들어 Ex클래스의 정보를 가져올 수 있는 연결점 ex를 만들고 저쪽에서 받은 정보를 토대로 canvas에 그림을 그려야 하기 때문에 파라미터로 Ex ex를 해준다. 그리고 그림판이니깐 알아볼수 있게 배경색을 지정한다. |
![]() |
그리고 Ex클래스에서 알아볼수 있게 중간 부분에 Drc클래스의 객체 canvas를 만들고 container에 add한다. |
![]() |
그럼 그림판 틀이 완성된다. |
그림그리기
틀을 만들었으니까 그림을 그리자.
그림판에 그림을 그리는 동작은 마우스로 이루어진다.
마우스를 클릭한 시점과 뗀 시점까지 좌표값을 통해서 그림을 그리고
마우스를 뗐을때 그림이 남아야한다.
일단 마우스의 동작을 선언하자
![]() |
Ex클래스의 기본생성자에 필요한 이벤트를 익명으로 만든다. 마우스를 처음 눌렀을때 좌표가 필요하고, 마우스를 끌어서 마지막에 두번째 좌표가 필요하다. |
![]() |
마우스를 찍었을때 나오는 좌표값을 JTextField에 저장해야한다. 그래서 x1T,y1T의 좌표값을 mousePressed에서 구해야 한다. setText()는 파라미터로 받는 값을 set(입력)해주는 메소드다. e.getX()는 마우스의 동작(MouseEvent e)에 좌표를 얻어오는 메소드다. 이 두개를 합해서 x1T.setText(e.getX());에서 setText는 String타입을 받는데 e.getX()는 int값이니깐 +""를 넣어서 int타입을 String으로 형변환해준다. 그럼 사진과 같이 도형을 그릴때 필요한 첫좌표값이 입력된다. 이제 두번째 좌표를 구하자 |
![]() |
이렇게 해주면 이제 그림에 필요한 첫 좌표와 두번째 좌표를 구했다. 근데 Ex클래스에는 paint()가 없어서 그림을 그릴 수 없다. 이제 Ex클래스에서 얻은 좌표를 Drc클래스로 보내서 그림을 그려줘야한다. 근데 필드에 private로 선언했기 때문에 그냥 보낼수 없다. getter를 잡자. |
![]() |
Ex클래스에 있는 private로 선언한 필드값들을 가져와야 하니깐 getter클래스를 만들어 다른 클래스에서도 사용할 수 있게 만든다. |
![]() |
Drc 클래스에 그림을 그릴 canvas가 될거니깐 여기에 paint()만들어야 한다. 그리고 Ex에서 마우스를 통해 얻은 좌표값을 얻어오기 위해 지역변수를 선언하고 값을 받아온다. |
![]() 예시)아래의 사진을 보면 나오는 x1의 값이 getter를 통해 위의 사진으로 간다 ![]() |
먼저 Ex클래스의 값을 받아올려면 연결점인 변수 ex를 사용한다. 그리고 x1의 좌표를 위해 미리 만든 getter중 getX1T()를 불러온다. 그리고 그곳에 있는 값을 가져오는 getText()를 사용한다. (ex.getX1T().getText());를 하면 마우스로 찍은 x1의 값을 가져올 수 있다. 그리고 이건 Sting타입이니깐 Integer로 변환한다. trim()메소드는 빈칸을 없애주는 메소드이다. |
![]() |
근데 실행하면 이렇게 오류가 나온다. 이유는 윈도우창 실행 -> paint()가 callback 메소드라서 마우스를 찍기도 전에 x,y 값을 가져옴.-> 아무값도 없는데 가져가니까 오류 오류를 없애는 방법은 좌표의 textfield에 0을 미리 선언하는거다. |
![]() |
이렇게 하면 오류가 사라진다. 이제 좌표를 얻어왔으니까 그림을 그려야 한다. 도형을 그려보자 |
![]() |
Drc의 paint()에 도형에 대한 코드를 만들었다. 그림판을 보면 채우기를 했을때 와 안했을 떄 2가지의 경우가 있다. 그림을 보면 이해가 된다 isSelected()는 선택했다면 이라는 메소드다. 이 안에 x1, y1, x2, y2, z1, z2의 좌표를 잘 넣어보자 |
![]() |
이렇게 넣으면 그림이 그려지긴 하는데 좌표값이 이상하게 찍히고 왼쪽에서 오른쪽으로만 찍히고 그림을 하나 그리고 또 그리면 없어지고 색을 채우기해도 뭐 안생긴다. 여기서 z1,z2의값은 둥근 사각형에만 있는데 이건 모서리의 굴절을 나타낸다 일단 50으로 고정한다. 이제 생각을 많이 해야한다. x2,y2의 값은 시작점에서 드래그가 끝난 시점이다. 그럼 좌표의 값은 x2-x1, y2-y1이 된다. 그다음 그림을 왼쪽->오른쪽 방향으로만 그릴게 아니라 양옆 위아래로도 다 되야 한다. 그럼 x1,y1값이 x2,y2보다 작아질수도 있고... x2-x1한게 음수가 나올수도 있다. 일단 음수를 잡자 Math.abs()를 사용하면 된다 |
![]() |
x2,y2의 값을 제대로 잡으니깐 왼쪽->오른쪽으로 만드는 것도 제대로 된다. 반대로그리는건.... 드래그를 반대로 하니깐 x1가x2가 되버리고 y1이y2가 되버린다. 반대로 가면 대칭이니깐 그럼 두개다쓰고 최소값을 구하자 Math.min() *drawLine은 그냥(x1, y1, x2, y2)로 해야한다... |
![]() |
이렇게 하면 그림은 이제 좌우, 위아래로 해도 잘그려진다. 이제 색을 채우자 근데 색상을 필드로 지정해야 하는데 고정된 색은 상수로 만들면된다 enum으로 만들어보자 |
채우기가 되는과정? | |
코드를 짤때 순서를 좌표먼저하고 색을 채우고 도형을 그려야 한다. 그냥 만들때 뭘먼저 만들지 상관은 없지만 입력하는 순서를 다르게해서 좌표, 도형, 색 이렇게 입력하면 첫도형을 그릴때 색이 안칠해진다. enum으로 색을 정하고 switch로 색을 입력하는건 그냥.... 색을 입력해야 되는 시점에 색상을 넣어줘야하는데 new color보다 상수로 하는게 더 편하고 확실하니까 상수로 하기로 결정한다. 그럼 어느 클래스에 만들지 결정하는데 아무데나 만들어도 상관은 없다. 그래서 shpaeDTO 클래스에 만든다. shapeDTO는 그림을 그리고 다음그림을 그릴때 도형이 남을 수 있게 1개의 도형을 객체배열처럼 저장하기 위해 만든 클래스다. |
'JAVA' 카테고리의 다른 글
10/23 수업내용 (0) | 2020.10.23 |
---|---|
10/22 수업내용 (0) | 2020.10.22 |
10/19 수업 (0) | 2020.10.19 |
10/16 수업내용 (0) | 2020.10.16 |
스레드 (0) | 2020.10.16 |