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;
}//未完,下面继续

解决方案 »

  1.   

    public void writeShapes(String file) {
    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();
    }
    }
    }//未完,下面继续
      

  2.   

    class PaintFrame extends JFrame {
    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();
    }
    }
      

  3.   

    up..好像不能连续发三贴。帮你UP一下。  ^___________^
      

  4.   

    我的天,终于贴完了:)大家可以把上面的代码都粘贴到一个JPaint.java的文件里,编译完成后用:java JPaint就可以运行了。
      

  5.   

    楼主,我在你这里找到了我的一个解决方案,你可以到我发的贴那里去看看,我给你分
    http://community.csdn.net/Expert/topic/3279/3279946.xml?temp=.3126795
      

  6.   

    楼上客气了,我的这个程序设想都来源于Core Java这本(很好的书啊,推荐大家都看看)。还有谢谢 nirvana_li(东成西就,芝兰境界)等朋友的提醒注释问题,写注释很重要的,不过自己写代码的时候比较偷懒,然后感觉Java代码的可读性很好,所以省略了注释。
      

  7.   

    我觉得java编写的软件是不是有点慢啊?
      

  8.   

    <core java>电子书给一个吧
    [email protected]
      

  9.   

    我也要去down1.5
    不过楼顶,“move”只能move第一个画的对象。
      

  10.   

    to kevin_wang(勇气不再有):
    可能是我的程序还有问题,移动,删除的功能总是不稳定:(
    以后再改改~
      

  11.   

    (2004-08-20 20:47:14)   兔子
    (2004-08-20 19:51:23)   兔子
    你在吗 我是兔子 我在网上看见你的画图版程序
    我有个十万火急的编程任务 和这类似但 圆 线 
    分装在不同的类 还要在 主类中实现方法 
    我把它发往你的邮箱了 description.zip是任务要求
    Startcode.zip多谢拉 编程天才7谢 谢谢谢谢谢谢
       
      qq 19155994
      

  12.   

    楼主你不用MVC就写出来了???
      

  13.   

    To asklxf(xuefeng) :我是一个刚学Java的小菜鸟(以前有C/C++的编程经验),说实话,我还不知道什么叫MVC(Model View Control?),所以就那刚学的Swing知识编了这个程序。
      

  14.   

    还不错啊,就是失真现象不叫严重。你可以用java把计算机图形学中的画线算法直接表示在源代码中,虽然比较烦琐,但能较好的处理失真