public class PrimaryPanel extends JPanel
-메뉴판넬
-메뉴버튼(마우스,액션리스너)
-옵션판넬
-색 지정 버튼
-포인트 사이즈 라벨
-포인트 사이즈 텍필
-체크박스
-DrawingPanel
***포인트사이즈 반환
***색 반환
***마우스리스너(마우스리스너)
-마우스 클릭
-마우스 누름
-마우스 뗌
-마우스 진입
-색지정버튼 색 변화(in)
-메뉴버튼 색 변화(in)
-마우스 탈출
-색지정버튼 색 변화(out)
-메뉴버튼 색 변화(out)
***액션리스너(액션리스너)
-액션
-DrawingPanel 실행
-true,false설정
public class DrawConstants
-색 상수
-메뉴 진입 배경 색
-메뉴 진입 글자 색
-메뉴 탈출 배경 색
-메뉴 탈출 글자 색
-항목 상수
-포인트 상수지정
-라인 상수지정
-사각형 상수지정
-원 상수지정
public class SimplePaint
-프로그램실행
public class DrawingPanel extends JPanel
-primaryPanel
-마우스 리스너
-라인저장 포인트
-드래그 포인트
-드래그 확인 boolean
***드로우 모드 설정
***포인트 사이즈 설정
***마우스리스너(마우스리스너,모션리스너)
-마우스 클릭
-포인트 좌표 저장,그림
-마우스 누름
-라인1 좌표 저장,드래그true
-마우스 뗌
-라인2 좌표 저장,드래그false
-마우스 진입
-마우스 탈출
-마우스 드래그
-드래그 좌표 저장
public class DrawData
-라인 저장 포인트
-체크박스 확인 boolean
-색 저장
***포인트 좌표 저장함수
***라인,사각형,원 저장 함수
***드로우 모드 설정된 값 반환
***포인트 좌표 값 반환
***포인트 x값 반환
***포인트 y값 반환
***설정된 색 반환
***라인 포인트1 반환
***라인 포인트2 반환
***라인 포인트1 x값 반환
***라인 포인트1 y값 반환
***라인 포인트2 x값 반환
***라인 포인트2 y값 반환
public class SimplePaint 실행
public class PrimaryPanel 기본판넬
1.크기
2.메뉴판넬(메뉴버튼)
3.옵션판넬(색지정버튼,
포인트사이즈라벨,
포인트사이즈텍스트,
fill체크박스)
4.drawing판넬
public class DrawingPanel 판넬
public class DrawData 좌표저장
public class DrawConstants 상수저장
import javax.swing.JFrame;
public class SimplePaint { public static void main(String[] args) { JFrame frame = new JFrame("Simple Paint Program"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); PrimaryPanel primary = new PrimaryPanel(); frame.getContentPane().add(primary); frame.pack(); frame.setVisible(true); } }
import java.awt.*; //for color class
public class DrawConstants { public static final int MENU_NUM = 6; //static=>객체 없이 클래스의 이름으로 바로 접근 public static final String[] MENU = {"POINT", "LINE", "RECT", "OVAL", "", ""}; public static final Color MENU_ENTERED_BACKCOLOR = Color.cyan; public static final Color MENU_ENTERED_FORECOLOR = Color.red; public static final Color MENU_EXITED_BACKCOLOR = Color.white; public static final Color MENU_EXITED_FORECOLOR = Color.black; //각 메뉴에 대한 정수값 public final static int NONE = -1; //drawmode가 아닐겨우 public final static int POINT = 0; public final static int LINE = 1; public final static int RECT = 2; public final static int OVAL = 3; }
import java.awt.*; import javax.swing.*; import java.awt.event.*;
public class PrimaryPanel extends JPanel { private JPanel menuPanel, optionPanel; private JButton[] btnMenu; private JButton btnColorSelect; private JLabel lblPointSize; private JTextField txtPointSize; private JCheckBox chkFill; private int nPointSize; private boolean bFill; private Color selectedColor;//클래스들마다 같은 이름의 Color지만 다 다른것들. private MenuMouseListener menuMouseL; private MenuActionListener menuActionL; private DrawingPanel drawPanel; public PrimaryPanel() { setBackground(Color.white); setPreferredSize(new Dimension(600,600)); setLayout(null); menuMouseL = new MenuMouseListener(); menuActionL = new MenuActionListener(); menuPanel = new JPanel(); menuPanel.setBounds(10,10,400,100); menuPanel.setBorder(BorderFactory.createTitledBorder("MENU")); menuPanel.setBackground(Color.white); menuPanel.setLayout(new GridLayout(2,3)); add(menuPanel); btnMenu = new JButton[DrawConstants.MENU_NUM]; //배열을 선언, 객체선언X for(int i=0; i<DrawConstants.MENU_NUM;i++) { btnMenu[i] = new JButton(DrawConstants.MENU[i]); btnMenu[i].setBackground(DrawConstants.MENU_EXITED_BACKCOLOR); btnMenu[i].setForeground(DrawConstants.MENU_EXITED_FORECOLOR); btnMenu[i].addMouseListener(menuMouseL); btnMenu[i].addActionListener(menuActionL); menuPanel.add(btnMenu[i]); } optionPanel = new JPanel(); optionPanel.setBounds(420,10,200,100); optionPanel.setBorder(BorderFactory.createTitledBorder("OPTION")); optionPanel.setBackground(Color.white); optionPanel.setLayout(null); add(optionPanel); btnColorSelect = new JButton("Color Select"); btnColorSelect.setBounds(20,20,160,30); btnColorSelect.addMouseListener(menuMouseL); btnColorSelect.setBackground(DrawConstants.MENU_EXITED_BACKCOLOR); btnColorSelect.setForeground(DrawConstants.MENU_EXITED_FORECOLOR); btnColorSelect.addActionListener(menuActionL); optionPanel.add(btnColorSelect); lblPointSize = new JLabel("Point Size"); lblPointSize.setBounds(20,60,60,30); lblPointSize.setVisible(false); optionPanel.add(lblPointSize); nPointSize = 20; txtPointSize = new JTextField(); txtPointSize.setBounds(80,60,100,30); txtPointSize.setText("" + nPointSize); txtPointSize.setVisible(false); optionPanel.add(txtPointSize); bFill = false; // 처음에 체크해서 실행시키고 싶으면 true를 준다. chkFill = new JCheckBox("FILL"); chkFill.setBounds(20,60,140,30); chkFill.setBackground(Color.white); chkFill.setSelected(bFill); chkFill.setVisible(false); optionPanel.add(chkFill); //upcall.하위가 상위 받음. drawPanel = new DrawingPanel(this);//upcall.하위가 상위 받음.넌센스. drawPanel.setBackground(Color.white); drawPanel.setBounds(14,110,600,500); add(drawPanel); selectedColor = Color.black; } public int getPointSize() { return Integer.parseInt(txtPointSize.getText());//upcall.하위가 상위 받음.넌센스. } public Color getSelectedColor() { return selectedColor;//upcall.하위가 상위 받음.넌센스. } private class MenuMouseListener implements MouseListener { public void mouseClicked(MouseEvent event){} public void mousePressed(MouseEvent event){} public void mouseReleased(MouseEvent event){} public void mouseEntered(MouseEvent event) { Object obj = event.getSource(); if(obj == btnColorSelect) { btnColorSelect.setBackground(DrawConstants.MENU_ENTERED_BACKCOLOR); btnColorSelect.setForeground(DrawConstants.MENU_EXITED_FORECOLOR); } else { for(int i = 0; i<DrawConstants.MENU_NUM;i++) { if(obj == btnMenu[i]) { btnMenu[i].setBackground(DrawConstants.MENU_ENTERED_BACKCOLOR); btnMenu[i].setForeground(DrawConstants.MENU_ENTERED_FORECOLOR); break; } // 찾아서 바꿔줌 } } } public void mouseExited(MouseEvent event) { Object obj = event.getSource(); if(obj == btnColorSelect) { btnColorSelect.setBackground(DrawConstants.MENU_EXITED_BACKCOLOR); btnColorSelect.setForeground(DrawConstants.MENU_EXITED_FORECOLOR); } else { for(int i = 0; i<DrawConstants.MENU_NUM;i++) { if(obj == btnMenu[i]) { btnMenu[i].setBackground(DrawConstants.MENU_EXITED_BACKCOLOR); btnMenu[i].setForeground(DrawConstants.MENU_EXITED_FORECOLOR); break; } // 찾아서 바꿔줌 } } } } private class MenuActionListener implements ActionListener { public void actionPerformed(ActionEvent event) { Object obj = event.getSource(); if(obj == btnColorSelect) { selectedColor = JColorChooser.showDialog(drawPanel,"Color Select",selectedColor); } else { for(int i = 0; i<DrawConstants.MENU_NUM;i++) { if(obj == btnMenu[i]) { drawPanel.setDrawMode(i); switch(i) { case DrawConstants.POINT: chkFill.setVisible(false); lblPointSize.setVisible(true); txtPointSize.setVisible(true); break; case DrawConstants.LINE: chkFill.setVisible(false); lblPointSize.setVisible(false); txtPointSize.setVisible(false); break; case DrawConstants.RECT: case DrawConstants.OVAL: chkFill.setVisible(true); lblPointSize.setVisible(false); txtPointSize.setVisible(false); break; } //switch }// 0이면 point 1이면 ...... } } } } }
import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; // for array list
public class DrawingPanel extends JPanel { private PrimaryPanel primary;//upcall.하위가 상위 받음.넌센스. private ArrayList<DrawData> dataList; // 내부적으로 링키드 리스트 만들어줌, = > DrawData를 저장할수잇는 형태로 생김 private int nDrawMode; //Point private Point pt; private int nPointSize; private Color selectedColor;//색 설정. private Point pt1,pt2;//line 저장 private Point ptDrag1,ptDrag2;//드래그 private boolean bDrag;//드래그모드인지 아니지.press는 true, released는 false private DrawMouseListener drawMouseL;
public DrawingPanel(PrimaryPanel panel)//upcall.하위가 상위 받음.넌센스. { primary = panel;//upcall.하위가 상위 받음.넌센스. drawMouseL = new DrawMouseListener(); addMouseListener(drawMouseL); addMouseMotionListener(drawMouseL);//드래그 dataList = new ArrayList<DrawData>(); //nDrawMode = DrawConstants.POINT; // ponint test nDrawMode = DrawConstants.NONE; pt = new Point(); nPointSize = primary.getPointSize();//upcall.하위가 상위 받음.넌센스. selectedColor = primary.getSelectedColor();//upcall.하위가 상위 받음.넌센스. pt1 =new Point(); pt2 =new Point(); ptDrag1 = new Point(); ptDrag2 = new Point(); bDrag = false; } // DrawingPanel() public void setDrawMode(int mode){ nDrawMode = mode;} public void setPointSize(int size){nPointSize = size;} public void paintComponent(Graphics page) { super.paintComponent(page); //부모의 실제 권한 얻어오기 page.drawRect(0,0,599,499); if(bDrag) { selectedColor = primary.getSelectedColor(); page.setColor(selectedColor); switch(nDrawMode) { case DrawConstants.LINE: page.drawLine(ptDrag1.x,ptDrag1.y,ptDrag2.x,ptDrag2.y); break; case DrawConstants.RECT: break; case DrawConstants.OVAL: break; } } //list에 저장된걸 꺼내와서 drawmode를 보고 point면..... for(int i = 0; i<dataList.size();i++)//저장된 데이터를 그린다.(드래그는 저장되지 않음.) { DrawData tempData = dataList.get(i); page.setColor(tempData.getSelectedColor()); switch(tempData.getDrawMode()) { case DrawConstants.POINT: page.fillOval(tempData.getX()-tempData.getPointSize(), tempData.getY()-tempData.getPointSize(), tempData.getPointSize(), tempData.getPointSize()); break; case DrawConstants.LINE: page.drawLine(tempData.getX1(),tempData.getY1(),tempData.getX2(),tempData.getY2()); break; case DrawConstants.RECT: break; case DrawConstants.OVAL: break; } } } private class DrawMouseListener implements MouseListener, MouseMotionListener//MouseMotionListener는 드래그위함.이벤트핸들러2개추가 { public void mouseClicked(MouseEvent event) { if (nDrawMode == DrawConstants.POINT) { nPointSize = primary.getPointSize();//upcall.하위가 상위 받음.넌센스. selectedColor = primary.getSelectedColor(); dataList.add(new DrawData(nDrawMode, event.getPoint(), nPointSize,selectedColor)); //클릭할때마다 이 3개가 저장 repaint(); } // 드로우모드가 포인트일때 저장(point and size save) } //mouseClicked() public void mousePressed(MouseEvent event)//라인 { if(nDrawMode == DrawConstants.LINE) { pt1 = event.getPoint(); ptDrag1 = event.getPoint();//위에 pt1써도되지만 학업을 위해 분리한다 bDrag = true;//press true } } public void mouseReleased(MouseEvent event)//라인 { if(nDrawMode == DrawConstants.LINE) { pt2 = event.getPoint(); selectedColor = primary.getSelectedColor(); dataList.add(new DrawData(nDrawMode,pt1,pt2,selectedColor));//라인저장 repaint();//호출해야 그림그린다. bDrag = false;//release false } } public void mouseEntered(MouseEvent event){} public void mouseExited(MouseEvent event){} public void mouseMoved(MouseEvent event){} public void mouseDragged(MouseEvent event) { if(nDrawMode == DrawConstants.LINE) { ptDrag2 = event.getPoint(); repaint(); } } } }
import java.awt.*; //for point use
public class DrawData { private Point pt1,pt2;//라인저장 private int nDrawMode; private Point pt; private int nPointSize; private Color selectedColor;//색 저장. private boolean bFill; public DrawData(int mode, Point p, int size,Color c) { nDrawMode = mode; pt = p; nPointSize = size; selectedColor = c; } // DrawData() public DrawData(int mode,Point p1,Point p2,Color c)//라인저장 { nDrawMode = mode; pt1 = p1; pt2 = p2; selectedColor = c; } // private 에 접근하기 위해 public int getDrawMode(){return nDrawMode;} public Point getPoint(){return pt;} public int getX() {return pt.x;} public int getY() {return pt.y;} public int getPointSize(){return nPointSize;} public Color getSelectedColor(){return selectedColor;} public Point getPoint1(){return pt1;} public Point getPoint2(){return pt2;} public int getX1(){return pt1.x;} public int getY1(){return pt1.y;} public int getX2(){return pt2.x;} public int getY2(){return pt2.y;} } //DrawData class