class PaintPanel extends JPanel {
private int currentShape;
private boolean currentFill;
private Color currentColor;
private Color currentBackColor;
private boolean paintEnabled;
private ArrayList polygon;
private int moveX, moveY;
private int currentX, currentY; public PaintPanel() {
paintEnabled = false;
currentFill = false;
currentColor = Color.BLACK;
currentBackColor = Color.WHITE;
polygon = new ArrayList(25);
setLayout(new BorderLayout());
ButtonPanel buttonPanel = new ButtonPanel();
add(buttonPanel, BorderLayout.NORTH);
add(new LabelPanel(), BorderLayout.SOUTH);
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
buttonPanel.cusorButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintEnabled = false;
setCursor(
Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
});
buttonPanel.lineButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintEnabled = true;
setCursor(Cursor.getDefaultCursor());
currentShape = Shape.LINE;
}
});
buttonPanel.squareButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintEnabled = true;
setCursor(Cursor.getDefaultCursor());
currentShape = Shape.SQUARE;
}
});
buttonPanel.ellipseButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintEnabled = true;
setCursor(Cursor.getDefaultCursor());
currentShape = Shape.ELLIPSE;
}
});
buttonPanel.colorButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
Color defaultColor = Color.BLACK;
Color selected = JColorChooser.showDialog(
PaintPanel.this, "Change Color", defaultColor);
currentColor = selected;
}
});
} public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g; int w = getWidth();
int h = getHeight();
Rectangle2D scale = new Rectangle2D.Double(0, 0, w, h);
g2.setColor(currentBackColor);
g2.fill(scale); for(int i = 0; i < polygon.size(); i++) {
Shape temp = (Shape)polygon.get(i);
g2.setColor(temp.color);
switch(temp.shape) {
case Shape.LINE:
Line2D showLine = new Line2D.Double(
temp.getStart(), temp.getEnd());
g2.draw(showLine);
break;
case Shape.SQUARE:
Rectangle2D showSquare = new Rectangle2D.Double();
showSquare.setFrameFromDiagonal(
temp.getStart(), temp.getEnd());
if(temp.isFill)
g2.fill(showSquare);
else
g2.draw(showSquare);
break;
case Shape.ELLIPSE:
Ellipse2D showEllipse = new Ellipse2D.Double();
showEllipse.setFrameFromDiagonal(
temp.getStart(), temp.getEnd());
if(temp.isFill)
g2.fill(showEllipse);
else
g2.draw(showEllipse);
break;
}
}
}
public void setBackColor(Color color) {
currentBackColor = color;
}
public void setForeColor(Color color) {
currentColor = color;
}
public void setDraw() {
currentFill = false;
} public void setFill() {
currentFill = true;
}//未完,下面继续
private int currentShape;
private boolean currentFill;
private Color currentColor;
private Color currentBackColor;
private boolean paintEnabled;
private ArrayList polygon;
private int moveX, moveY;
private int currentX, currentY; public PaintPanel() {
paintEnabled = false;
currentFill = false;
currentColor = Color.BLACK;
currentBackColor = Color.WHITE;
polygon = new ArrayList(25);
setLayout(new BorderLayout());
ButtonPanel buttonPanel = new ButtonPanel();
add(buttonPanel, BorderLayout.NORTH);
add(new LabelPanel(), BorderLayout.SOUTH);
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
buttonPanel.cusorButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintEnabled = false;
setCursor(
Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
});
buttonPanel.lineButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintEnabled = true;
setCursor(Cursor.getDefaultCursor());
currentShape = Shape.LINE;
}
});
buttonPanel.squareButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintEnabled = true;
setCursor(Cursor.getDefaultCursor());
currentShape = Shape.SQUARE;
}
});
buttonPanel.ellipseButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintEnabled = true;
setCursor(Cursor.getDefaultCursor());
currentShape = Shape.ELLIPSE;
}
});
buttonPanel.colorButton.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
Color defaultColor = Color.BLACK;
Color selected = JColorChooser.showDialog(
PaintPanel.this, "Change Color", defaultColor);
currentColor = selected;
}
});
} public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g; int w = getWidth();
int h = getHeight();
Rectangle2D scale = new Rectangle2D.Double(0, 0, w, h);
g2.setColor(currentBackColor);
g2.fill(scale); for(int i = 0; i < polygon.size(); i++) {
Shape temp = (Shape)polygon.get(i);
g2.setColor(temp.color);
switch(temp.shape) {
case Shape.LINE:
Line2D showLine = new Line2D.Double(
temp.getStart(), temp.getEnd());
g2.draw(showLine);
break;
case Shape.SQUARE:
Rectangle2D showSquare = new Rectangle2D.Double();
showSquare.setFrameFromDiagonal(
temp.getStart(), temp.getEnd());
if(temp.isFill)
g2.fill(showSquare);
else
g2.draw(showSquare);
break;
case Shape.ELLIPSE:
Ellipse2D showEllipse = new Ellipse2D.Double();
showEllipse.setFrameFromDiagonal(
temp.getStart(), temp.getEnd());
if(temp.isFill)
g2.fill(showEllipse);
else
g2.draw(showEllipse);
break;
}
}
}
public void setBackColor(Color color) {
currentBackColor = color;
}
public void setForeColor(Color color) {
currentColor = color;
}
public void setDraw() {
currentFill = false;
} public void setFill() {
currentFill = true;
}//未完,下面继续
try {
PrintWriter out = new PrintWriter(new
FileWriter(file));
out.println(polygon.size());
out.println(getWidth() + "|" + getHeight() + "|" +
currentBackColor.getRGB());
for(int i = 0; i < polygon.size(); i++)
((Shape)(polygon.get(i))).writeData(out); out.close();
} catch(IOException exception) {
exception.printStackTrace();
}
}
public void readShapes(String file) {
try {
BufferedReader in = new BufferedReader(new
FileReader(file)); int size = Integer.parseInt(in.readLine());
String back = in.readLine();
StringTokenizer t = new StringTokenizer(back, "|");
int w = Integer.parseInt(t.nextToken());
int h = Integer.parseInt(t.nextToken());
currentBackColor = new Color(Integer.parseInt(t.nextToken())); polygon.clear();
Shape temp;
for(int i = 0; i < size; i++) {
temp = new Shape();
temp.readData(in);
polygon.add(temp);
} setSize(w, h);
in.close();
} catch(IOException exception) {
exception.printStackTrace();
}
}
private class LabelPanel extends JPanel {
JLabel label; public LabelPanel() {
label = new JLabel("Current X: " + currentX
+ " Current Y: " + currentY);
add(label);
} public void paintComponent(Graphics g) {
super.paintComponent(g);
label.setText("Current X: " + currentX
+ " Current Y: " + currentY);
}
} private class MouseHandler extends MouseAdapter {
private int tempX;
private int tempY;
private Shape temp; public void mousePressed(MouseEvent event) {
tempX = event.getX();
tempY = event.getY();
currentX = tempX;
currentY = tempY; int isLeft = event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK;
int isRight = event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK; if(isLeft != 0 && paintEnabled) {
switch(currentShape) {
case Shape.LINE:
temp = new Line();
break;
case Shape.SQUARE:
temp = new Square();
break;
case Shape.ELLIPSE:
temp = new Ellipse();
break;
default:
temp = new Line();
}
temp.setStart(tempX, tempY);
temp.setEnd(tempX, tempY);
temp.color = currentColor;
temp.isFill = currentFill;
polygon.add(temp);
setCursor(Cursor.getPredefinedCursor(
Cursor.CROSSHAIR_CURSOR));
} else if(isLeft != 0 && !paintEnabled) {
int size = polygon.size();
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
for(int i = 0; i < size; i++) {
temp = (Shape)polygon.get(i);
if(temp.isContain(tempX, tempY))
temp.isSelected = true;
}
moveX = tempX;
moveY = tempY;
} else if(isRight != 0) {
for(int i = 0; i < polygon.size(); i++) {
temp = (Shape)polygon.get(i);
if(temp.isContain(tempX, tempY)) {
polygon.remove(i);
i--;
}
}
repaint();
}
} public void mouseReleased(MouseEvent event) {
tempX = event.getX();
tempY = event.getY();
currentX = tempX;
currentY = tempY; int isLeft = event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK;
if(isLeft != 0 && paintEnabled) {
temp = (Shape)polygon.get(polygon.size() - 1);
temp.setEnd(tempX, tempY);
}
if(!paintEnabled) {
int size = polygon.size();
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
for(int i = 0; i < size; i++) {
temp = (Shape)polygon.get(i);
temp.isSelected = false;
}
}
else
setCursor(Cursor.getDefaultCursor());
}
} private class MouseMotionHandler implements MouseMotionListener {
private int tempX;
private int tempY;
private Shape temp; public void mouseMoved(MouseEvent event) {
currentX = event.getX();
currentY = event.getY();
repaint();
} public void mouseDragged(MouseEvent event) {
tempX = event.getX();
tempY = event.getY();
currentX = tempX;
currentY = tempY;
int isLeft = event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK;
int isRight = event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK; if(isLeft != 0 && paintEnabled) {
int size = polygon.size();
temp = (Shape)polygon.get(size - 1);
temp.setEnd(tempX, tempY);
} else if(isLeft != 0 && !paintEnabled) {
int size = polygon.size();
int x1, y1, x2, y2;
for(int i = 0; i < size; i++) {
temp = (Shape)polygon.get(i);
if(temp.isSelected) {
x1 = (int)temp.getStart().getX() + (tempX - moveX);
y1 = (int)temp.getStart().getY() + (tempY - moveY);
x2 = (int)temp.getEnd().getX() + (tempX - moveX);
y2 = (int)temp.getEnd().getY() + (tempY - moveY);
temp.setStart(x1, y1);
temp.setEnd(x2, y2);
}
moveX = tempX;
moveY = tempY;
}
}
repaint();
}
}
}//未完,下面继续
PaintPanel paintPanel;
JMenuItem backItem;
JMenuItem foreItem;
JRadioButtonMenuItem draw;
JRadioButtonMenuItem fill;
private static int ID = -1;
public PaintFrame() {
ID++;
if(ID == 0)
setTitle("JPaint v1.0");
else
setTitle("JPaint v1.0(" + ID + ")"); setBounds(150, 150, 500, 400); paintPanel = new PaintPanel();
getContentPane().add(paintPanel); JMenuBar menuBar = makeMenuBar();
setJMenuBar(menuBar); backItem.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
Color defaultColor = Color.WHITE;
Color selected = JColorChooser.showDialog(
PaintFrame.this, "Background Color", defaultColor);
paintPanel.setBackColor(selected);
}
});
foreItem.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
Color defaultColor = Color.BLACK;
Color selected = JColorChooser.showDialog(
PaintFrame.this, "Change ForeColor", defaultColor);
paintPanel.setForeColor(selected);
}
});
draw.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintPanel.setDraw();
}
});
fill.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
paintPanel.setFill();
}
});
} private JMenuBar makeMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic('F');
menuBar.add(fileMenu); JMenuItem newItem = new JMenuItem("New", 'N');
newItem.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
newItem.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
PaintFrame frame = new PaintFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.show();
}
});
fileMenu.add(newItem); JMenuItem openItem = new JMenuItem("Open", 'O');
openItem.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
openItem.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.addChoosableFileFilter(new MyFilter());
int result = chooser.showOpenDialog(PaintFrame.this); if(result == JFileChooser.APPROVE_OPTION) {
String file = chooser.getSelectedFile().getName();
paintPanel.readShapes(file);
}
}
});
fileMenu.add(openItem);
JMenuItem saveItem = new JMenuItem("Save", 'O');
saveItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_S, InputEvent.CTRL_MASK));
saveItem.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.addChoosableFileFilter(new MyFilter());
int result = chooser.showSaveDialog(PaintFrame.this); if(result == JFileChooser.APPROVE_OPTION) {
String file = chooser.getSelectedFile().getName();
paintPanel.writeShapes(file);
}
}
});
fileMenu.add(saveItem);
fileMenu.addSeparator();
JMenuItem exitItem = new JMenuItem("Exit", 'x');
exitItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_X, InputEvent.CTRL_MASK));
exitItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
fileMenu.add(exitItem);
JMenu setMenu = new JMenu("Settings");
setMenu.setMnemonic('S');
menuBar.add(setMenu); backItem = new JMenuItem("Background", 'B');
setMenu.add(backItem);
foreItem = new JMenuItem("ForColor", 'C');
setMenu.add(foreItem);
ButtonGroup group = new ButtonGroup();
draw = new JRadioButtonMenuItem("Draw", true);
fill = new JRadioButtonMenuItem("Fill", false);
group.add(draw);
group.add(fill);
JMenu style = new JMenu("Style");
style.add(draw);
style.add(fill);
setMenu.add(style); JMenu helpMenu = new JMenu("Help");
helpMenu.setMnemonic('H');
menuBar.add(helpMenu); JMenuItem helpItem = new JMenuItem("Help", 'H');
helpItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_H, InputEvent.CTRL_MASK));
helpItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent event) {
HelpFrame help = new HelpFrame();
help.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
help.show();
}
});
helpMenu.add(helpItem);
JMenuItem aboutItem = new JMenuItem("About", 'A');
aboutItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_A, InputEvent.CTRL_MASK));
aboutItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent event) {
JOptionPane.showMessageDialog(
PaintFrame.this, " JPaint Version 0.1\n\n" +
"Author : jellen chan \nE-mail : [email protected]");
}
});
helpMenu.add(aboutItem);
return menuBar;
} private class MyFilter extends FileFilter {
public boolean accept(File f) {
return f.getName().toLowerCase().endsWith(".jpt")
|| f.isDirectory();
} public String getDescription() {
return "JPaint file type";
}
} private class HelpFrame extends JFrame {
public HelpFrame() {
setTitle("JPaint Help");
setSize(450, 520);
setResizable(false);
JTextArea text = new JTextArea(20, 42);
Font f = new Font("Arial", Font.PLAIN, 20);
text.setFont(f);
text.setForeground(Color.BLUE);
text.setLineWrap(true);
text.setWrapStyleWord(true);
text.setEditable(false); text.append(" JPaint v0.1 Help\n\n");
text.append(" JPaint is a simple drawing program that is " +
"written in Java. It is a free software, you can " +
"modify the source code and use it in your own " +
"applications. But please send a copy of it to me via " +
"E-mail. JPaint uses a file type which ends with postfix" +
" *.jpt, this is a file type which suits JPaint(and it " +
"is created by me, though very simple:)\n");
text.append(" You can draw Rectangles, ellipses, lines by " +
"clicking on different buttons. Change the fore and " +
"back color is also available by clicking on the button" +
" or choose the menu bar. You can move the shapes by " +
"clicking the move button. The shapes can be deleted by " +
"pressing the right key of your mouse.\n"); getContentPane().add(text);
}
}
}public class JPaint {
public static void main(String[] args) {
PaintFrame frame = new PaintFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
http://community.csdn.net/Expert/topic/3279/3279946.xml?temp=.3126795
[email protected]
不过楼顶,“move”只能move第一个画的对象。
可能是我的程序还有问题,移动,删除的功能总是不稳定:(
以后再改改~
(2004-08-20 19:51:23) 兔子
你在吗 我是兔子 我在网上看见你的画图版程序
我有个十万火急的编程任务 和这类似但 圆 线
分装在不同的类 还要在 主类中实现方法
我把它发往你的邮箱了 description.zip是任务要求
Startcode.zip多谢拉 编程天才7谢 谢谢谢谢谢谢
qq 19155994