************************************************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
복사