这是我学习java与面向对象时候的一个课程作业。其实就是课本上的例子,做了些简单的修改。
程序在以下环境下调试通过:
操作系统:Windows XP Pro XP1
编程工具:J2sdk 1.4.2,JCreator V3.5 Pro
程序名称:DrawTool (一个简单的绘图工具)
程序功能:1—实现了 在绘图区域绘制一个正方形,且能够实现图形的拖动等基本操作。
2—实现了 通过菜单,选择框等控件正方形的边框颜色,且可以选择是否填充。
3—实现了 绘图区的清空,通过ScrollBar改变正方形大小的功能。
4—实现了 形状未创建之前清空、改变大小等报错功能
5—实现了 程序的窗口的关闭,在菜单中退出功能。
程序中用到的类:
DrawTool :包含主程序的类。
DrawFrame :JFrame类的扩展,提供绘图工具的用户界面。
DrawCanvas :JComponent类的扩展,提供 绘图区。
ClearButton :JButton 的扩展,充当清除绘图区的角色。
Rectangle :一个矩形类,维护矩形的当前位置,并画出来。
WidthScrollbar :JScrollBar类的扩展,用来改变形状的大小。
ColorDelegator :一个处理颜色改变的类。
程序的源代码:
1 – DrawTool.Java
package zhijun.drawtool;
import zhijun.drawtool.DrawFrame;
public class DrawTool{
private static DrawFrame drawFrame;
public static void main(String [] args){
drawFrame=new DrawFrame();
drawFrame.show();
}
}
2 – DrawFrame.java
package zhijun.drawtool;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DrawFrame extends JFrame
implements WindowListener, ActionListener
{ private ColorDelegator choiceHandler;
private void addItem(JMenu menu, String colorName, ActionListener listener)
{ JMenuItem nextItem = new JMenuItem(colorName);
nextItem.setActionCommand(colorName);
nextItem.addActionListener(listener);
menu.add(nextItem);
}
public DrawFrame()
{ this.setLocation(100,100);
this.setSize(500,300);
this.setResizable(false);
JComboBox colorChoice = new JComboBox();
colorChoice.addItem("Red");
colorChoice.addItem("Green");
colorChoice.addItem("Blue");
colorChoice.setSelectedItem("Blue");
ClearButton clearButton = new ClearButton();
DrawCanvas canvas = new DrawCanvas(clearButton);
JLabel widthLabel = new JLabel("Change Rectangle Width");
WidthScrollbar widthScroll = new WidthScrollbar();
widthScroll.addAdjustmentListener(canvas);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(widthLabel);
panel.add(widthScroll);
panel.add(colorChoice);
panel.add(clearButton);
Container content=this.getContentPane();
content.setLayout(new BorderLayout());
content.add(canvas, BorderLayout.CENTER);
content.add(panel, BorderLayout.SOUTH);
choiceHandler = new ColorDelegator(canvas);
colorChoice.addItemListener(choiceHandler);
JMenu colorMenu = new JMenu("SetColor");
addItem(colorMenu, "Red", choiceHandler);
addItem(colorMenu, "Green", choiceHandler);
addItem(colorMenu, "Blue", choiceHandler);
addItem(colorMenu, "Pink", choiceHandler);
addItem(colorMenu, "Magenta", choiceHandler);
addItem(colorMenu, "Orange", choiceHandler);
addItem(colorMenu, "Cyan", choiceHandler);
addItem(colorMenu, "DarkGray", choiceHandler);
addItem(colorMenu, "LightGray", choiceHandler);
addItem(colorMenu, "Gray", choiceHandler);
addItem(colorMenu, "White", choiceHandler);
addItem(colorMenu, "Black", choiceHandler);
JCheckBoxMenuItem filledItem = new JCheckBoxMenuItem("Filled");
filledItem.addItemListener(canvas);
JMenu command = new JMenu("Command");
command.add(filledItem);
command.addSeparator();
addItem(command, "Clear", canvas);
addItem(command, "Quit", this);
JMenuBar menuBar = new JMenuBar();
menuBar.add(command);
this.setJMenuBar(menuBar);
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(colorMenu);
canvas.addPopup(popupMenu);
this.addWindowListener(this);
}
public void windowClosing(WindowEvent e) { System.exit(0); }
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
public void actionPerformed(ActionEvent e) { System.exit(0); }
}
3 – DrawCanvas.java
package zhijun.drawtool;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DrawCanvas extends JComponent
implements ActionListener, MouseListener, MouseMotionListener, ItemListener, AdjustmentListener
{
private Rectangle rectangle;
private ClearButton clearButton;
private Color currentColor;
JPopupMenu popup;
public DrawCanvas(ClearButton clearButton)
{
this.clearButton=clearButton;
rectangle=null;
currentColor=Color.red;
this.setBackground(Color.yellow);
clearButton.addActionListener(this);
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
public void addPopup(JPopupMenu popup)
{
this.popup = popup;
this.add(popup);
}
public void setColor(Color color) { currentColor=color; }
public void paint(Graphics g)
{ g.setColor(getBackground());
Dimension size=getSize();
g.fillRect(0,0,size.width,size.height);
if (rectangle !=null)
{
g.setColor(currentColor);
rectangle.draw(g);
}
}
public void mousePressed(MouseEvent event)
{ if (event.getButton() == MouseEvent.BUTTON3)
popup.show(this, event.getX(),event.getY());
else if (event.getButton() == MouseEvent.BUTTON1)
{ rectangle = new Rectangle(event.getX(), event.getY());
repaint();
}
}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
public void mouseClicked(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void mouseDragged(MouseEvent event)
{ if (rectangle == null)
{ rectangle.moveTo(event.getX(), event.getY());
repaint();
}
}
public void mouseMoved(MouseEvent event) {}
public void actionPerformed(ActionEvent e)
{ if(rectangle == null)
{ JOptionPane.showMessageDialog(this, "还没有画出矩形,干吗这么着急清空。", "错误提示", JOptionPane.WARNING_MESSAGE);
}
if(e.getActionCommand().equals("Clear"))
{ rectangle = null;
repaint();
}
}
public void itemStateChanged(ItemEvent e)
{ JCheckBoxMenuItem item = (JCheckBoxMenuItem)e.getSource();
Rectangle.setFilled(item.getState());
repaint();
}
public void adjustmentValueChanged(AdjustmentEvent e)
{ if(rectangle == null)
{ JOptionPane.showMessageDialog(this, "还没有画出矩形,系统自动为您生成一个。", "错误提示", JOptionPane.WARNING_MESSAGE);
}
int width = e.getValue();
rectangle.setWidth(width);
repaint();
}
}
4 – ColorDelegator.java
package zhijun.drawtool;
import java.awt.*;
import java.awt.event.*;
public class ColorDelegator implements ItemListener, ActionListener
{ private DrawCanvas drawingArea;
public ColorDelegator(DrawCanvas canvas) { drawingArea = canvas; }
public void itemStateChanged(ItemEvent e)
{ String colorName = (String)e.getItem();
Color newColor = null;
if (colorName.equals("Red")) newColor = Color.red;
else if (colorName.equals("Green")) newColor = Color.green;
else newColor = Color.blue;
drawingArea.setColor(newColor);
drawingArea.repaint();
}
public void actionPerformed(ActionEvent event)
{ String colorName = (String)event.getActionCommand();
Color newColor = null;
if (colorName.equals("Red")) newColor = Color.red;
else if (colorName.equals("Green")) newColor = Color.green;
else if (colorName.equals("Blue")) newColor = Color.blue;
else if (colorName.equals("Pink")) newColor = Color.pink;
else if (colorName.equals("Magenta")) newColor = Color.magenta;
else if (colorName.equals(" Orange")) newColor = Color.orange;
else if (colorName.equals("Cyan")) newColor = Color.cyan;
else if (colorName.equals("DarkGray")) newColor = Color.darkGray;
else if (colorName.equals("LightGray")) newColor = Color.lightGray;
else if (colorName.equals("Gray")) newColor = Color.gray;
else if (colorName.equals("White")) newColor = Color.white;
else if (colorName.equals("Black")) newColor = Color.black;
drawingArea.setColor(newColor);
drawingArea.repaint();
}
}
5 – ClearButton.java
package zhijun.drawtool;
import java.awt.*;
import javax.swing.*;
public class ClearButton extends JButton
{ public ClearButton()
{ super("Clear Canvas");
this.setActionCommand("Clear");
}
}
6 – Rectangle.java
package zhijun.drawtool;
import java.awt.*;
public class Rectangle
{ private int x;
private int y;
private int width = 100;
private static boolean filled = false;
public Rectangle(int x,int y)
{ this.x=x;
this.y=y;
}
public void moveTo(int x,int y)
{ this.x=x;
this.y=y;
}
public void draw(Graphics g)
{ if (filled) g.fillRect(x, y, width, width);
else g.drawRect(x, y, width, width);
}
public static void setFilled(boolean state) { filled = state; }
public void setWidth(int width) { this.width = width; }
}
7 – WidthScrollbar.java
package zhijun.drawtool;
import java.awt.Dimension;
import javax.swing.*;
public class WidthScrollbar extends JScrollBar
{ public WidthScrollbar() { super(JScrollBar.HORIZONTAL, 100, 10, 100, 200); }
public Dimension getPreferredSize() { return new Dimension(100, 20); }
}