Skip to content

Commit 11bd4b1

Browse files
committed
JavaPainer is a simple analog for MS Windows Paint
0 parents  commit 11bd4b1

File tree

10 files changed

+670
-0
lines changed

10 files changed

+670
-0
lines changed

JavaPainter.jar

15.6 KB
Binary file not shown.
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package painter.controller;
2+
3+
import java.awt.event.ActionEvent;
4+
import java.awt.event.ActionListener;
5+
import java.awt.event.MouseEvent;
6+
import java.awt.event.MouseListener;
7+
import java.awt.event.MouseMotionListener;
8+
9+
import javax.swing.JLabel;
10+
import javax.swing.JPanel;
11+
12+
import painter.model.PainterModel;
13+
import painter.view.ColorLabel;
14+
import painter.view.PainterCanvas;
15+
16+
17+
public class PainterController implements MouseListener, MouseMotionListener, ActionListener {
18+
19+
20+
private PainterModel model;
21+
22+
public void setModel(PainterModel m) {model = m;}
23+
24+
25+
@Override
26+
public void actionPerformed(ActionEvent e) {
27+
if (e.getActionCommand().equals("mnuExit")) {
28+
System.exit(0);
29+
}
30+
if (e.getActionCommand().equals("mnuNew")) {
31+
model.cleanCanvas();
32+
}
33+
34+
if (e.getActionCommand().equals("mnuSave")) {
35+
if (model == null ) return;
36+
model.saveImage();
37+
}
38+
39+
if (e.getActionCommand().equals("mnuLoad")) {
40+
if (model == null ) return;
41+
model.loadImage();
42+
}
43+
}
44+
45+
@Override
46+
public void mouseClicked(MouseEvent e) {
47+
48+
if (e.getSource() instanceof ColorLabel ) {
49+
ColorLabel clrLabel = (ColorLabel) e.getSource();
50+
model.setColorLabelControlActive(clrLabel);
51+
}
52+
if (e.getSource() instanceof JLabel) {
53+
JLabel srcLabel = (JLabel) e.getSource();
54+
model.getActiveColorLabel().setColor(srcLabel.getBackground());
55+
}
56+
if (e.getSource() instanceof JPanel) {
57+
JPanel srcPanel = (JPanel) e.getSource();
58+
59+
if (srcPanel.getName().equals("chooser")) {
60+
model.chooseAndSetColor();
61+
}
62+
}
63+
64+
}
65+
66+
@Override
67+
public void mousePressed(MouseEvent e) {
68+
if (e.getSource() instanceof PainterCanvas) {
69+
// 1 for left mouse Button; 2 for right muse Button
70+
int buttonNumber = 1; //left mouse button by default
71+
72+
/* here we define which mouse button is pressed
73+
* by experiment (using system.out.println) i learned that
74+
* e.getModifiers() == 16 for left mouse button and
75+
* e.getModifiers() == 4 for right mouse button
76+
*/
77+
if (e.getModifiers() == 16) buttonNumber = 1;
78+
else if (e.getModifiers() == 4) buttonNumber = 2;
79+
80+
model.addPoint(buttonNumber, e.getPoint(), true);
81+
}
82+
}
83+
84+
85+
@Override
86+
public void mouseDragged(MouseEvent e) {
87+
// 1 for left mouse Button; 2 for right muse Button
88+
int buttonNumber = 1; //left mouse button by default
89+
90+
//Here we define which mouse button is pressed
91+
if (e.getModifiers() == 16) buttonNumber = 1;
92+
else if (e.getModifiers() == 4) buttonNumber = 2;
93+
94+
model.addPoint(buttonNumber, e.getPoint(), false);
95+
}
96+
97+
// Unused methods
98+
@Override
99+
public void mouseMoved(MouseEvent e) {}
100+
101+
@Override
102+
public void mouseReleased(MouseEvent e) {}
103+
104+
@Override
105+
public void mouseEntered(MouseEvent e) { }
106+
107+
@Override
108+
public void mouseExited(MouseEvent e) {}
109+
}

painter/model/ColorPoint.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package painter.model;
2+
3+
import java.awt.Color;
4+
import java.awt.Point;
5+
6+
public class ColorPoint extends Point {
7+
private Color color;
8+
/* this is important. here we define that this is the start point in the sequence.
9+
* When user presses the mouse button and drags mouse we have a start point
10+
* and points that follow it in the sequence. When program redraws canvas,
11+
* we take all points in the ArayList and connect one point with another.
12+
* But if we have no such checking for start point then when user wants to start
13+
* drawing again, he/she presses mouse button but this the new point is not
14+
* separate from previous ones, but it is connected with the last point. Thus we have to set this
15+
* point as startPoint when we need it.*/
16+
private boolean startPoint = false;
17+
18+
public ColorPoint(Color c, int x, int y) {
19+
super(x, y);
20+
this.color = c;
21+
}
22+
23+
public Color getColor() {
24+
return color;
25+
}
26+
27+
public void setStartPoint(boolean b) {
28+
startPoint = b;
29+
}
30+
31+
public boolean isStartPoint() {
32+
return startPoint;
33+
}
34+
}

painter/model/IPainrerToolBar.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package painter.model;
2+
3+
import painter.view.ColorLabel;
4+
5+
public interface IPainrerToolBar {
6+
7+
ColorLabel getColorLabel(int n);
8+
9+
}

painter/model/IPainter.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package painter.model;
2+
3+
import java.awt.Color;
4+
5+
public interface IPainter {
6+
7+
Color[] colors = new Color[] {
8+
Color.BLACK, new Color(127, 127, 127), new Color(136, 0, 21), Color.RED, new Color(255, 127, 39),
9+
Color.YELLOW, new Color(34, 177, 76), new Color(0, 162, 232), new Color(63, 72, 204),
10+
new Color(163, 73, 164), Color.WHITE, new Color(195, 195, 195), new Color(185, 122, 87), Color.PINK,
11+
new Color(255, 201, 14), new Color(239, 228, 176), new Color(181, 230, 29), new Color(153, 217, 234),
12+
new Color(112, 146, 190), new Color(200, 191, 231)
13+
};
14+
15+
String[] colorsToolTips = new String[] {
16+
"×ĺđíűé", "Ňĺěíî-ńĺđűé", "Ňĺěíî-ęđŕńíűé", "Ęđŕńíűé","Îđŕíćĺâűé", "Ćĺëňűé", "Çĺëĺíűé", "Áčđţçîâűé",
17+
"Číäčăî", "Ëčëîâűé", "Áĺëűé", "Ńâĺňëî-ńĺđűé", "Ęîđč÷íĺâűé", "Đîçîâűé", "Çîëîňčńňűé", "Ńâĺňëî-ćĺëňűé",
18+
"Ňđŕâ˙íîé", "Ńâĺňëî-áčđţçîâűé", "Ńčçűé", "Ńčđĺíĺâűé"
19+
};
20+
21+
Color labelColorSelectedBackground = Color.ORANGE;
22+
}

painter/model/PainterModel.java

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package painter.model;
2+
3+
import java.awt.Color;
4+
import java.awt.Graphics2D;
5+
import java.awt.Image;
6+
import java.awt.Point;
7+
import java.awt.image.BufferedImage;
8+
import java.io.IOException;
9+
10+
import javax.imageio.ImageIO;
11+
import javax.swing.JColorChooser;
12+
import javax.swing.JFileChooser;
13+
import javax.swing.JOptionPane;
14+
import javax.swing.filechooser.FileNameExtensionFilter;
15+
16+
import painter.view.ColorLabel;
17+
import painter.view.PainterCanvas;
18+
19+
20+
public class PainterModel {
21+
22+
private PainterCanvas canvas;
23+
private IPainrerToolBar toolbar;
24+
25+
private ColorLabel colorLeft;
26+
private ColorLabel colorRight;
27+
private ColorLabel selectedRLColor;
28+
29+
public PainterModel(PainterCanvas c, IPainrerToolBar t) {
30+
canvas = c;
31+
toolbar = t;
32+
33+
colorLeft = toolbar.getColorLabel(1);
34+
colorRight = toolbar.getColorLabel(2);
35+
36+
if (colorLeft == null || colorRight == null) {
37+
JOptionPane.showMessageDialog(null, "Íå óäàëîñü ïîëó÷èòü ññûëêó(è)\n"
38+
+ "íà îáúåêòû ColorLabel â êëàññå PainterModel", "Îøèáêà", JOptionPane.ERROR_MESSAGE);
39+
}
40+
41+
selectedRLColor = colorLeft;
42+
}
43+
44+
45+
public void cleanCanvas() {
46+
canvas.cleanCanvas();
47+
}
48+
49+
public void saveImage() {
50+
if (canvas == null) return;
51+
52+
JFileChooser fchooser = new JFileChooser(".");
53+
FileNameExtensionFilter filter = new FileNameExtensionFilter("Image files", "jpg", "png", "gif");
54+
fchooser.setFileFilter(filter);
55+
fchooser.setAcceptAllFileFilterUsed(false);
56+
57+
int result = fchooser.showSaveDialog(null);
58+
if (result == JFileChooser.APPROVE_OPTION) {
59+
60+
BufferedImage image =(BufferedImage) canvas.createImage(canvas.getWidth(), canvas.getHeight());
61+
Graphics2D g2 = image.createGraphics();
62+
canvas.paint(g2);
63+
g2.dispose();
64+
65+
String filename = fchooser.getSelectedFile().getName();
66+
String fileExt = filename.substring(filename.length()-3, filename.length());
67+
68+
if (fileExt.equals("gif") || fileExt.equals("png") || fileExt.equals("jpg")) {
69+
70+
try {
71+
ImageIO.write(image, fileExt, fchooser.getSelectedFile());
72+
}
73+
catch(IOException io) { io.printStackTrace(); }
74+
}
75+
}
76+
}
77+
78+
public void loadImage() {
79+
if (canvas == null) return;
80+
81+
JFileChooser fchooser = new JFileChooser(".");
82+
FileNameExtensionFilter filter = new FileNameExtensionFilter("Image files", "jpg", "png", "gif");
83+
fchooser.setFileFilter(filter);
84+
fchooser.setAcceptAllFileFilterUsed(false);
85+
86+
int result = fchooser.showOpenDialog(null);
87+
if (result == JFileChooser.APPROVE_OPTION) {
88+
89+
try {
90+
Image image = ImageIO.read(fchooser.getSelectedFile());
91+
canvas.setImage(image);
92+
} catch(IOException io) { io.printStackTrace(); }
93+
94+
}
95+
}
96+
97+
public void chooseAndSetColor() {
98+
Color c = JColorChooser.showDialog(null, "Âûáîð öâåòà", selectedRLColor.getColor());
99+
if (c != null) {
100+
selectedRLColor.setColor(c);
101+
}
102+
}
103+
104+
/* Ïåðåêëþ÷àåò àêòèâíîå ïîëîæåíèå êîíòðîëîâ-ìîíèòîðîâ öâåòà äëÿ ëåâîé è ïðàâîé êíîïêè ìûøè
105+
* ýòîò ìåòîä ïîëó÷àåò óïðàâëåíè èç êîíòðîëëåðà (ñëóøàòåëÿ ñîáûòèé) */
106+
public void setColorLabelControlActive(ColorLabel cl) {
107+
if (cl != selectedRLColor)
108+
109+
if (cl.getName().equals("1")) {
110+
switchColorLabel(colorLeft, selectedRLColor);
111+
} else {
112+
switchColorLabel(colorRight, selectedRLColor);
113+
}
114+
}
115+
116+
// Ïåðåêëþ÷àåò àêòèâíîå ïîëîæåíèå êîíòðîëîâ-ìîíèòîðîâ öâåòà äëÿ ëåâîé è ïðàâîé êíîïêè ìûøè
117+
private void switchColorLabel(ColorLabel cl1, ColorLabel cl2) {
118+
cl1.setSelected(true);
119+
cl2.setSelected(false);
120+
selectedRLColor = cl1;
121+
}
122+
123+
124+
// Âîçâðàùåò àêòèâíóþ (âûáðàííóþ) êîìïîíåíòó ColorLabel
125+
public ColorLabel getActiveColorLabel() {
126+
return selectedRLColor;
127+
}
128+
129+
/**
130+
*
131+
* @param button the int value for mouse button 1 - for Left Button; 2 for Right Button
132+
* @param point - is mouse coordinates
133+
* @param start - this param defines if this point is start point for drawing.
134+
* Start point takes place every time when user presses button and then drugs mouse.
135+
* After user released button new start point should take place when user press mouse button again. */
136+
public void addPoint(int button, Point point, boolean start) {
137+
// 1 for left mouse Button
138+
// 2 for right muse Button
139+
Color color = (button == 1) ? colorLeft.getColor() : colorRight.getColor();
140+
ColorPoint cp = new ColorPoint(color, point.x, point.y);
141+
142+
if (start) {
143+
144+
/* this is important. here we define that this is the start point in the sequence.
145+
* when user presses the mouse button and drags mouse we have a start point
146+
* and points following it in the sequence. */
147+
cp.setStartPoint(true);
148+
}
149+
150+
canvas.addPoint(cp);
151+
}
152+
}

painter/view/ColorGrid.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package painter.view;
2+
3+
import java.awt.*;
4+
import java.awt.event.*;
5+
import javax.swing.*;
6+
7+
import painter.model.IPainter;
8+
9+
public class ColorGrid extends JPanel {
10+
11+
MouseListener controller;
12+
13+
public ColorGrid(MouseListener ml) {
14+
this.controller = ml;
15+
16+
int length = IPainter.colors.length;
17+
setLayout(new GridLayout(2, length / 2 , 3, 3));
18+
19+
for (int i = 0; i < length; i++) {
20+
JLabel color = new JLabel();
21+
color.setBorder(BorderFactory.createLineBorder(Color.BLACK));
22+
color.setPreferredSize(new Dimension(17, 17));
23+
color.setBackground(IPainter.colors[i]);
24+
color.setOpaque(true);
25+
color.setName("colorLabel");
26+
color.addMouseListener(controller);
27+
color.setToolTipText(IPainter.colorsToolTips[i]);
28+
this.add(color);
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)