Search

그림판 만들기

************************************************Constants.java********************************************************** import java.awt.Color; public class Constants { static final public String MENU[] = { "DOT", "LINE", "RECT", "OVAL", "UNDO","CLEAR","♥","ERASE" }; //메뉴 구성! static final public Color HOVERING[] = { Color.white, Color.black,Color.yellow, Color.red }; static final public int DOT = 0; static final public int LINE = 1; static final public int RECT = 2; static final public int OVAL = 3; static final public int UNDO = 4; static final public int CLEAR = 5; static final public int NONE = 6; static final public int ERASE = 7; } ************************************************DrawController.java********************************************************** import javax.swing.*; import java.util.ArrayList; import java.awt.*; import java.awt.event.*; public class DrawController extends JPanel { private SimplePainterModel nowData; private ArrayList<SimplePainterModel> savedList; private DrawListener drawL; private SimplePainterView view; private boolean bDrag; public DrawController(SimplePainterView v) { view = v; setBackground(Color.white); drawL = new DrawListener(); addMouseListener(drawL); addMouseMotionListener(drawL); nowData = new SimplePainterModel(); savedList = new ArrayList<SimplePainterModel>(); nowData.nDrawMode = Constants.NONE; bDrag = false; }//DrawController public void setDrawMode(int mode) { nowData.nDrawMode = mode; if(nowData.nDrawMode == Constants.DOT || nowData.nDrawMode == Constants.ERASE) view.setTxtSize(10); else view.setTxtSize(1); }//setDrawMode public void setSelectedColor(Color color) { nowData.selectedColor = color; } public void paintComponent(Graphics page) { super.paintComponent(page); if(bDrag) { switch(nowData.nDrawMode) { case Constants.LINE: page.setColor(nowData.selectedColor); Graphics2D page2 =(Graphics2D)page; page2.setStroke(new BasicStroke(nowData.nSize)); page.drawLine(nowData.ptOne.x, nowData.ptOne.y ,nowData.ptTwo.x,nowData.ptTwo.y ); break; case Constants.RECT: page.setColor(nowData.selectedColor); Graphics2D page3 =(Graphics2D)page; page3.setStroke(new BasicStroke(nowData.nSize)); page.drawRect(nowData.ptOne.x,nowData.ptOne.y,nowData.ptTwo.x-nowData.ptOne.x, nowData.ptTwo.y-nowData.ptOne.y); if(nowData.bFill == true) { page.fillRect(nowData.ptOne.x, nowData.ptOne.y, nowData.ptTwo.x-nowData.ptOne.x,nowData.ptTwo.y-nowData.ptOne.y); } //drawRect를 사용했고 bFill이 true인 경우 채워주게 했다. break; case Constants.OVAL: page.setColor(nowData.selectedColor); Graphics2D page4 =(Graphics2D)page; page4.setStroke(new BasicStroke(nowData.nSize)); page.drawOval(nowData.ptOne.x, nowData.ptOne.y, nowData.ptTwo.x-nowData.ptOne.x,nowData.ptTwo.y-nowData.ptOne.y); if(nowData.bFill == true) { page.fillOval(nowData.ptOne.x, nowData.ptOne.y, nowData.ptTwo.x-nowData.ptOne.x, nowData.ptTwo.y-nowData.ptOne.y); } //drawOval을 사용했고 bFill 이 true인 경우 채워주게 했다. break; }//switch }//if for(SimplePainterModel data:savedList) { switch(data.nDrawMode) { case Constants.DOT: page.setColor(data.selectedColor); page.fillOval(data.ptOne.x-data.nSize/2, data.ptOne.y-data.nSize/2,data.nSize,data.nSize); break; case Constants.LINE: page.setColor(data.selectedColor); Graphics2D page2 =(Graphics2D)page; page2.setStroke(new BasicStroke(data.nSize)); page.drawLine(data.ptOne.x, data.ptOne.y ,data.ptTwo.x,data.ptTwo.y); break; case Constants.RECT: page.setColor(data.selectedColor); Graphics2D page3 =(Graphics2D)page; page3.setStroke(new BasicStroke(data.nSize)); page.drawRect(data.ptOne.x, data.ptOne.y, data.ptTwo.x-data.ptOne.x, data.ptTwo.y-data.ptOne.y); if(data.bFill == true) { page.fillRect(data.ptOne.x, data.ptOne.y, data.ptTwo.x-data.ptOne.x, data.ptTwo.y-data.ptOne.y); } //드래그 끝 지점에서 첫 지점을 뺀 가로 세로 가 가로세로가 된다. break; case Constants.OVAL: page.setColor(data.selectedColor); Graphics2D page4 =(Graphics2D)page; page4.setStroke(new BasicStroke(data.nSize)); page.drawOval(data.ptOne.x, data.ptOne.y, data.ptTwo.x-data.ptOne.x, data.ptTwo.y-data.ptOne.y); if(data.bFill == true) { page.fillOval(data.ptOne.x, data.ptOne.y, data.ptTwo.x-data.ptOne.x, data.ptTwo.y-data.ptOne.y); } //드래그 끝 지점에서 첫 지점을 뺀 가로 세로 가 그 타원 가로세로가 된다. break; case Constants.ERASE: page.setColor(Color.white); page.fillOval(data.ptOne.x-data.nSize/2, data.ptOne.y-data.nSize/2,30,30); break; //지우개 기능. 흰 원으로 지우개를 설정하여 클릭하면 덮어지도록. case Constants.CLEAR: page.setColor(Color.white); page.drawRect(0,0,820,830); page.fillRect(0, 0, 820, 830); break; //clear하면 전체를 걍 덮어버린다. }//switch }//for }//paintComponent private class DrawListener implements MouseListener, MouseMotionListener{ @Override public void mouseClicked(MouseEvent e) { if(nowData.nDrawMode == Constants.DOT) { nowData.ptOne = e.getPoint(); nowData.nSize = view.getTxtSize(); savedList.add(new SimplePainterModel(nowData)); repaint(); } //if else if(nowData.nDrawMode == Constants.CLEAR) { savedList.add(new SimplePainterModel(nowData)); repaint(); } else if(nowData.nDrawMode == Constants.UNDO) { savedList.remove(savedList.size()-1); repaint(); //undo기능. savedList에서 remove를 해준다. } else if(nowData.nDrawMode == Constants.ERASE) { nowData.ptOne = e.getPoint(); nowData.nSize = view.getTxtSize(); savedList.add(new SimplePainterModel(nowData)); repaint(); } } //mouseClicked @Override public void mouseDragged(MouseEvent arg0) { if(nowData.nDrawMode == Constants.LINE) { nowData.ptTwo = arg0.getPoint(); repaint(); }//if }//mouseDragged @Override public void mouseMoved(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { if(nowData.nDrawMode == Constants.LINE) { bDrag = true; nowData.ptOne = e.getPoint(); nowData.nSize = view.getTxtSize(); }//if else if(nowData.nDrawMode == Constants.RECT) { bDrag = true; nowData.ptOne = e.getPoint(); nowData.nSize = view.getTxtSize(); nowData.bFill = view.getChkFill(); }//else if else if(nowData.nDrawMode == Constants.OVAL) { bDrag = true; nowData.ptOne = e.getPoint(); nowData.nSize = view.getTxtSize(); nowData.bFill = view.getChkFill(); } }//mousePressed @Override public void mouseReleased(MouseEvent e) { if(nowData.nDrawMode == Constants.LINE) { bDrag = false; nowData.ptTwo = e.getPoint(); savedList.add(new SimplePainterModel(nowData)); repaint(); }//if else if(nowData.nDrawMode == Constants.RECT) { bDrag = false; nowData.ptTwo = e.getPoint(); savedList.add(new SimplePainterModel(nowData)); repaint(); } else if(nowData.nDrawMode == Constants.OVAL) { bDrag = false; nowData.ptTwo = e.getPoint(); savedList.add(new SimplePainterModel(nowData)); repaint(); } }//mouseRelesed } } ************************************************SimplePainter.java********************************************************** import javax.swing.JFrame; public class SimplePainter { public static void main(String[] args) { // TODO Auto-generated method stub JFrame frame = new JFrame("SIMPLE PAINTER"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); SimplePainterView view = new SimplePainterView(); frame.getContentPane().add(view); frame.pack(); frame.setVisible(true); } } ************************************************SimplePainterModel.java********************************************************** import java.awt.Point; import java.awt.Color; public class SimplePainterModel { public int nDrawMode; public Point ptOne, ptTwo; public int nSize; public boolean bFill; public Color selectedColor; public SimplePainterModel() { nDrawMode = Constants.NONE; ptOne = new Point(); ptTwo = new Point(); nSize = 1; bFill = false; selectedColor = Color.black; } public SimplePainterModel(SimplePainterModel data) { nDrawMode = data.nDrawMode; ptOne = data.ptOne; ptTwo = data.ptTwo; nSize = data.nSize; bFill = data.bFill; selectedColor = data.selectedColor; } }//SimplePainterModel ************************************************SimplePainterView.java********************************************************** import javax.swing.*; import java.util.ArrayList; import java.awt.*; import java.awt.event.*; public class SimplePainterView extends JPanel{ private DrawController drawController; private JPanel menuPanel, optionPanel, messagePanel; private JButton[] btnMenuArray; private JTextField txtSize; private JButton btnColorChooser; private JCheckBox chkFill; private JLabel Message; //메세지 출력 private JLabel Creater; // 만든이 출력. public SimplePainterView() { setBackground(Color.white); setPreferredSize(new Dimension(820, 830)); setLayout(null); drawController = new DrawController(this); drawController.setBounds(10, 10, 800, 600); drawController.setBorder(BorderFactory.createTitledBorder("DRAWING")); add(drawController); menuPanel = new JPanel(); menuPanel.setBounds(10, 610, 300, 200); menuPanel.setBackground(Color.white); menuPanel.setBorder(BorderFactory.createTitledBorder("MENU")); menuPanel.setLayout(new GridLayout(2,4)); // 여기를 2, 4로 했다. 즉 8칸을 쓸 수 있다는 말. add(menuPanel); optionPanel = new JPanel(); optionPanel.setBounds(310, 610, 200, 200); optionPanel.setBackground(Color.white); optionPanel.setBorder(BorderFactory.createTitledBorder("OPTION")); optionPanel.setLayout(new GridLayout(3,1)); add(optionPanel); messagePanel = new JPanel(); messagePanel.setBounds(510, 610, 300, 100); messagePanel.setBackground(Color.white); messagePanel.setBorder(BorderFactory.createTitledBorder("MESSAGE")); add(messagePanel); // 이걸 100사이즈로 해서, creator가 들어갈 자리를 만들었다. Creater = new JLabel("19011449 YTK"); Creater.setBounds(510,711,300,100); Creater.setFont(new Font("Verdana", Font.BOLD, 15)); Creater.setVisible(true); Creater.setHorizontalAlignment(SwingConstants.CENTER); add(Creater); // 내이름 표시하는 거 Message = new JLabel(""); Message.setBounds(511,611,300,100); Message.setFont(new Font("Verdana", Font.BOLD, 15)); Message.setVisible(false); messagePanel.add(Message); //메세지 출력! btnMenuArray = new JButton[8]; //8개의 버튼에 대해 for(int i = 0; i < 8;i++) { btnMenuArray[i] = new JButton(Constants.MENU[i]); btnMenuArray[i].setBackground(Constants.HOVERING[0]); btnMenuArray[i].setForeground(Constants.HOVERING[1]); btnMenuArray[i].addMouseListener(new HoveringListener()); btnMenuArray[i].addActionListener(new MenuListener()); menuPanel.add(btnMenuArray[i]); } btnColorChooser = new JButton("COLOR CHOOSER"); btnColorChooser.setBackground(Constants.HOVERING[0]); btnColorChooser.setForeground(Constants.HOVERING[1]); btnColorChooser.addMouseListener(new HoveringListener()); btnColorChooser.addActionListener(new MenuListener()); optionPanel.add(btnColorChooser); txtSize = new JTextField(); txtSize.setFont(new Font("Verdana", Font.BOLD, 16)); txtSize.setVisible(false); optionPanel.add(txtSize); chkFill = new JCheckBox("FILL"); chkFill.setBackground(Color.white); chkFill.setVisible(false); chkFill.setFont(new Font("Verdana", Font.BOLD, 16)); optionPanel.add(chkFill); }//SimplePainterView() public void setTxtSize(int size) { txtSize.setText(Integer.toString(size)); } public int getTxtSize() { return Integer.parseInt(txtSize.getText()); } public boolean getChkFill() { return chkFill.isSelected(); } private class HoveringListener implements MouseListener{ @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub JButton btnMenu = (JButton)e.getSource(); btnMenu.setBackground(Constants.HOVERING[2]); btnMenu.setForeground(Constants.HOVERING[3]); } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub JButton btnMenu = (JButton)e.getSource(); btnMenu.setBackground(Constants.HOVERING[0]); btnMenu.setForeground(Constants.HOVERING[1]); } @Override public void mouseClicked(MouseEvent e) {} @Override public void mousePressed(MouseEvent e) {} @Override public void mouseReleased(MouseEvent e) {} }//HoveringListener class private class MenuListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); txtSize.setVisible(true); chkFill.setVisible(false); if(obj == btnColorChooser) { Color c = JColorChooser.showDialog(btnColorChooser, "COLOR CHOOSER", Color.black); drawController.setSelectedColor(c); } else if(obj == btnMenuArray[0]) { Message.setVisible(true); Message.setText("You can make dot by click."); } else if(obj == btnMenuArray[1]) { Message.setVisible(true); Message.setText("You can draw line by drag."); } else if(obj == btnMenuArray[2]) { Message.setVisible(true); Message.setText("You can draw Rect by drag."); } else if(obj == btnMenuArray[3]) { Message.setVisible(true); Message.setText("You can draw Oval by drag."); } else if(obj == btnMenuArray[4]) { Message.setVisible(true); Message.setText("Touch screen to Undo."); } else if(obj == btnMenuArray[5]) { Message.setVisible(true); Message.setText("Touch screen to clear"); } else if(obj == btnMenuArray[6]) { Message.setVisible(true); Message.setText("Made by. taegang Yun"); } else if(obj == btnMenuArray[7]) { Message.setVisible(true); Message.setText("Touch to erase"); } //메세지들 출력하게. for(int i = 0; i <8;i++) { if(obj == btnMenuArray[i]) { drawController.setDrawMode(i); if(i == Constants.RECT || i == Constants.OVAL) { chkFill.setVisible(true); break; } else if(i == Constants.NONE) txtSize.setVisible(false); // 내 이름 표시하는 버튼 누르면. txtSize표시할 필요 없으니까 else if(i == Constants.ERASE || i == Constants.UNDO || i == Constants.CLEAR) txtSize.setVisible(false); // 지우개 버튼 눌러도 이거 필요 없으니까. 지우개 크기는 고정해놓았다. 다른 것도 마찬가지 } } }//actionPerformed() }//MenuListener class }//SimplePainterView
Java
복사