更新时间:2021-09-29 09:05:16 来源:极悦 浏览785次
有一个简单的工具来绘制基本的几何形状。该Java开发工具是使用 AWT 组件编写的,并详细阐述了诸如内部类、事件处理、多态性和菜单处理等功能。在本文中,我们将逐块逐步执行代码以构建我们的简单绘图工具。
首先,我们从一个空的类结构开始,我们从 java.awt.Frame 类扩展/继承它。我们设置框架的标题和大小并使其可见。
//Title: A Simple Drawing Tool
//Version: 1.0
//Copyright: Copyright (c) 2001
//Author: Yasir Feroze Minhas
//Company: KAPS Computing (pvt) Ltd.
//Description: This is a simple tool written using AWT for drawing basic shapes.
package graph;
import java.awt.*;
public class SimpleDrawingTool extends Frame{
public SimpleDrawingTool() {
//set frame's title
super("Simple Drawing Tool");
//set frame size
this.setSize(400, 400);
//make this frame visible
this.setVisible(true);
}
public static void main(String[] args) {
SimpleDrawingTool simpleDrawingTool = new SimpleDrawingTool();
}
}
接下来,我们将菜单栏附加到我们的绘图工具,并用最少的菜单项对其进行装饰。
//Title: A Simple Drawing Tool
//Version: 1.0
//Copyright: Copyright (c) 2001
//Author: Yasir Feroze Minhas
//Company: KAPS Computing (pvt) Ltd.
//Description: This is a simple tool written using AWT for drawing basic shapes.
package graph;
import java.awt.*;
public class SimpleDrawingTool extends Frame{
//constants for menu shortcuts
private static final int kControlA = 65;
private static final int kControlD = 68;
private static final int kControlC = 67;
private static final int kControlR = 82;
private static final int kControlP = 80;
private static final int kControlT = 84;
private static final int kControlX = 88;
public SimpleDrawingTool() {
//set frame's title
super("Simple Drawing Tool");
//add menu
addMenu();
//set frame size
this.setSize(400, 400);
//make this frame visible
this.setVisible(true);
}
public static void main(String[] args) {
SimpleDrawingTool simpleDrawingTool = new SimpleDrawingTool();
}
/**
This method creates menu bar and menu items and then attach the menu bar
with the frame of this drawing tool.
*/
private void addMenu()
{
//Add menu bar to our frame
MenuBar menuBar = new MenuBar();
Menu file = new Menu("File");
Menu shape = new Menu("Shapes");
Menu about = new Menu("About");
//now add menu items to these Menu objects
file.add(new MenuItem("Exit", new MenuShortcut(kControlX)));
shape.add(new MenuItem("Rectangle", new MenuShortcut(kControlR)));
shape.add(new MenuItem("Circle", new MenuShortcut(kControlC)));
shape.add(new MenuItem("Triangle", new MenuShortcut(kControlT)));
shape.add(new MenuItem("Polygon", new MenuShortcut(kControlP)));
shape.add(new MenuItem("Draw Polygon", new MenuShortcut(kControlD)));
about.add(new MenuItem("About", new MenuShortcut(kControlA)));
//add menus to menubar
menuBar.add(file);
menuBar.add(shape);
menuBar.add(about);
//menuBar.setVisible(true);
if(null == this.getMenuBar())
{
this.setMenuBar(menuBar);
}
}//addMenu()
}
菜单栏就位,您可以导航不同的菜单和菜单项。但由于它们尚未附加任何事件处理程序,因此您只能做导航。下一步是添加事件处理程序,以便我们可以捕获用户的选择并采取相应的行动。
package graph;
import java.awt.*;
//import event package
import java.awt.event.*;
//import swing package for pop up message box
import javax.swing.*;
public class SimpleDrawingTool extends Frame{
...
private void addMenu()
{
...
file.add(new MenuItem("Exit", new MenuShortcut(kControlX))).addActionListener(new WindowHandler());
shape.add(new MenuItem("Rectangle", new MenuShortcut(kControlR))).addActionListener(new WindowHandler());
shape.add(new MenuItem("Circle", new MenuShortcut(kControlC))).addActionListener(new WindowHandler());
shape.add(new MenuItem("Triangle", new MenuShortcut(kControlT))).addActionListener(new WindowHandler());
shape.add(new MenuItem("Polygon", new MenuShortcut(kControlP))).addActionListener(new WindowHandler());
shape.add(new MenuItem("Draw Polygon", new MenuShortcut(kControlD))).addActionListener(new WindowHandler());
about.add(new MenuItem("About", new MenuShortcut(kControlA))).addActionListener(new WindowHandler());
...
}
...
//Inner class to handle events
private class WindowHandler extends WindowAdapter implements ActionListener
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
public void actionPerformed(ActionEvent e)
{
System.out.println(e.getActionCommand());
//check to see if the action command is equal to exit
if(e.getActionCommand().equalsIgnoreCase("exit"))
{
System.exit(0);
}
else if(e.getActionCommand().equalsIgnoreCase("About"))
{
JOptionPane.showMessageDialog(null, "This small freeware program is written by Yasir Feroze Minhas.", "About", JOptionPane.PLAIN_MESSAGE);
}
else
{
JOptionPane.showMessageDialog(null, "You asked for a "+e.getActionCommand(), "A Simple Drawing Tool", JOptionPane.PLAIN_MESSAGE);
}
}//actionPerformed()
}//windowHandler - Inner Class ends here
}
现在是时候写下我们的 Shapes 类了。我们使用一种方法将 Shapes 类定义为抽象类draw(),然后将其扩展为 Rectangle、Oval、Triangle 和 Polygon 的具体类。然后我们使用多态根据传递的上述具体类的运行时对象绘制不同的形状。
/**
This is the abstract parent class for different shape classes,
like rectangle, oval, polygon and triangle. It provides an abstract
method draw().
*/
package graph;
import java.util.*;
import java.awt.*;
public abstract class Shapes
{
/**abstract method draw()
@return void
*/
public abstract void draw(java.util.List list, Graphics g);
}
//different implementations of Shape class
class RectangleShape extends Shapes
{
Point sPoint = null;
Point ePoint = null;
public void draw(java.util.List list, Graphics g)
{
Iterator it = list.iterator();
//if the list does not contain the required two points, return.
if(list.size()<2)
{
return;
}
sPoint = (Point)it.next();
ePoint = (Point)it.next();
if(sPoint == null || ePoint == null)
{
return;
}
else
{
g.fillRect((int)sPoint.getX(), (int)sPoint.getY(), (int)(ePoint.getX()-sPoint.getX()),
(int)(ePoint.getY()-sPoint.getY()));
}//end of if
list.clear();
}//end of draw for rectangle
}//rectangle
class OvalShape extends Shapes
{
Point sPoint = null;
Point ePoint = null;
public void draw(java.util.List list, Graphics g)
{
Iterator it = list.iterator();
//if the list does not contain the required two points, return.
if(list.size()<2)
{
return;
}
sPoint = (Point)it.next();
ePoint = (Point)it.next();
if(sPoint == null || ePoint == null)
{
return;
}
else
{
g.fillOval((int)sPoint.getX(), (int)sPoint.getY(), (int)(ePoint.getX()-sPoint.getX()),
(int)(ePoint.getY()-sPoint.getY()));
}//end of if
list.clear();
}//end of draw for Oval
}//OvalShape
class TriangleShape extends Shapes
{
public void draw(java.util.List list, Graphics g)
{
Point point = null;
Iterator it = list.iterator();
//if the list does not contain the required two points, return.
if(list.size()<3)
{
return;
}
Polygon p = new Polygon();
for(int i = 0; i < 3; i++)
{
point = (Point)it.next();
p.addPoint((int)point.getX(), (int)point.getY());
}
g.fillPolygon(p);
list.clear();
}//end of draw for Triangle
}//Triangle
class PolygonShape extends Shapes
{
public void draw(java.util.List list, Graphics g)
{
Point point = null;
Iterator it = list.iterator();
//if the list does not contain the required two points, return.
if(list.size()<3)
{
return;
}
Polygon p = new Polygon();
for(;it.hasNext();)
{
point = (Point)it.next();
p.addPoint((int)point.getX(), (int)point.getY());
}
g.fillPolygon(p);
list.clear();
}//end of draw for Polygon
}//Polygon
现在我们向我们的简单绘图工具添加一个面板并重写我们的 WindowHandler 类,以便它启用/禁用菜单选择并将相应的 Shapes 对象传递给面板进行绘图。这是actionPerformedSimpleDrawingTool 和 DrawingPanel 类的更改方法。
public void actionPerformed(ActionEvent e)
{
//check to see if the action command is equal to exit
if(e.getActionCommand().equalsIgnoreCase("exit"))
{
System.exit(0);
}
else if(e.getActionCommand().equalsIgnoreCase("Rectangle"))
{
Menu menu = getMenuBar().getMenu(1);
for(int i = 0;i < menu.getItemCount();menu.getItem(i).setEnabled(true),i++);
getMenuBar().getShortcutMenuItem(new MenuShortcut(kControlR)).setEnabled(false);
panel.drawShape(rectangle);
}
else if(e.getActionCommand().equalsIgnoreCase("Circle"))
{
Menu menu = getMenuBar().getMenu(1);
for(int i = 0;i < menu.getItemCount();menu.getItem(i).setEnabled(true),i++);
getMenuBar().getShortcutMenuItem(new MenuShortcut(kControlC)).setEnabled(false);
panel.drawShape(oval);
}
else if(e.getActionCommand().equalsIgnoreCase("Triangle"))
{
Menu menu = getMenuBar().getMenu(1);
for(int i = 0;i < menu.getItemCount();menu.getItem(i).setEnabled(true),i++);
getMenuBar().getShortcutMenuItem(new MenuShortcut(kControlT)).setEnabled(false);
panel.drawShape(triangle);
}
else if(e.getActionCommand().equalsIgnoreCase("Polygon"))
{
Menu menu = getMenuBar().getMenu(1);
for(int i = 0;i < menu.getItemCount();menu.getItem(i).setEnabled(true),i++);
getMenuBar().getShortcutMenuItem(new MenuShortcut(kControlP)).setEnabled(false);
panel.drawShape(polygon);
}
else if(e.getActionCommand().equalsIgnoreCase("Draw Polygon"))
{
Menu menu = getMenuBar().getMenu(1);
for(int i = 0;i < menu.getItemCount();menu.getItem(i).setEnabled(true),i++);
getMenuBar().getShortcutMenuItem(new MenuShortcut(kControlP)).setEnabled(false);
panel.repaint();
}
else if(e.getActionCommand().equalsIgnoreCase("About"))
{
JOptionPane.showMessageDialog(null, "This small freeware program is written by Yasir Feroze Minhas.", "About", JOptionPane.PLAIN_MESSAGE);
}
}//actionPerformed()
class DrawingPanel extends Panel implements MouseListener
{
private Point sPoint = null;
private Point ePoint = null;
private Shapes shape = null;
private java.util.ArrayList list = new java.util.ArrayList();
//override panel paint method to draw shapes
public void paint(Graphics g)
{
g.setColor(Color.green);
shape.draw(list, g);
}
public void drawShape(Shapes shape)
{
this.shape = shape;
}
//define mouse handler
public void mouseClicked(MouseEvent e)
{
//if user wants to draw triangle, call repaint after 3 clicks
if(shape instanceof TriangleShape)
{
list.add(e.getPoint());
if(list.size() > 2)
{
repaint();
}
}
else if(shape instanceof PolygonShape)
{
list.add(e.getPoint());
}
}//mouseClicked
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e)
{
sPoint = e.getPoint();
}//mousePressed
public void mouseReleased(MouseEvent e)
{
ePoint = e.getPoint();
if(ePoint.getX() < sPoint.getX())
{
Point temp = ePoint;
ePoint = sPoint;
sPoint = temp;
}
if(ePoint.getY() < sPoint.getY())
{
int temp = (int)ePoint.getY();
ePoint.y = (int)sPoint.getY();
sPoint.y = temp;
}
if(shape instanceof RectangleShape || shape instanceof OvalShape)
{
list.clear();
list.add(sPoint);
list.add(ePoint);
repaint();
}
}//mouseReleased
}//DrawingPanel
现在我们完成了我们的 SimpleDrawingTool,并且可以使用鼠标在其面板上绘制基本的几何形状。然而,这段代码仍然存在一些问题,我们将在下一版本的 SimpleDrawingTool 中回来重新审视这段代码,并增强它以包括填充颜色选择和鼠标移动跟踪线,同时绘制具有更好菜单的形状对象选择选项。
在Java学习中会运用到很的开发工具,大家可都要熟练使用哦。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习