📄 draw.java
字号:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Draw extends JFrame
{
Container container=this.getContentPane();
MenuBar myMenuBar=new MenuBar();
//定义左侧及底部的工具栏
JToolBar myToolBar=new JToolBar("Tool",JToolBar.VERTICAL);
JToolBar myColorBar=new JToolBar("Color",JToolBar.HORIZONTAL);
//定义左侧工具栏上的上部及下部面板,上部容纳按钮,下部显示画图状态及鼠标位置
JPanel panelToolBar=new JPanel();
MessagePanel panelMsgToolBar=new MessagePanel();
//画图主面板
MyPanel panelDraw=new MyPanel();
public Draw()
{
super("Draw");
//构造程序各部分的GUI
AddMenu();
AddToolBar();
AddColorBar();
//为画图主面板注册事件
panelDraw.addMouseListener(panelDraw);
panelDraw.addMouseMotionListener(panelDraw);
//组合各模块,成为整体
container.add(panelDraw,BorderLayout.CENTER);
container.add(myColorBar,BorderLayout.SOUTH);
container.add(myToolBar,BorderLayout.WEST);
container.setBackground(Color.DARK_GRAY);
//最大化显示
int width = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() ;
int height = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() ;
this.setSize(width,height-25) ;
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
//颜色工具栏构造函数
public void AddColorBar()
{
myColorBar.setFloatable(false);
myColorBar.setBackground(Color.LIGHT_GRAY);
myColorBar.setLayout(new GridLayout(1,1,5,5));
JLabel lbMsgColor=new JLabel("Select one color:");
myColorBar.add(lbMsgColor);
JButton jbRed=new JButton("red");
jbRed.setBackground(Color.RED);
jbRed.setToolTipText("红色");
jbRed.addActionListener(panelDraw);
myColorBar.add(jbRed);
JButton jbBlue=new JButton("blue");
jbBlue.setBackground(Color.BLUE);
jbBlue.addActionListener(panelDraw);
jbBlue.setToolTipText("蓝色");
myColorBar.add(jbBlue);
JButton jbGreen=new JButton("green");
jbGreen.setBackground(Color.GREEN);
jbGreen.setToolTipText("绿色");
jbGreen.addActionListener(panelDraw);
myColorBar.add(jbGreen);
JButton jbOrange=new JButton("orange");
jbOrange.setBackground(Color.ORANGE);
jbOrange.setToolTipText("橙色");
jbOrange.addActionListener(panelDraw);
myColorBar.add(jbOrange);
JButton jbWhite=new JButton("white");
jbWhite.setBackground(Color.WHITE);
jbWhite.setToolTipText("白色");
jbWhite.addActionListener(panelDraw);
myColorBar.add(jbWhite);
JButton jbPink=new JButton("pink");
jbPink.setBackground(Color.PINK);
jbPink.setToolTipText("粉色");
jbPink.addActionListener(panelDraw);
myColorBar.add(jbPink);
JButton jbCyan=new JButton("cyan");
jbCyan.setBackground(Color.CYAN);
jbCyan.setToolTipText("浅蓝");
jbCyan.addActionListener(panelDraw);
myColorBar.add(jbCyan);
JButton jbMagenta=new JButton("magenta");
jbMagenta.setBackground(Color.MAGENTA);
jbMagenta.setToolTipText("紫色");
jbMagenta.addActionListener(panelDraw);
myColorBar.add(jbMagenta);
JButton jbYellow=new JButton("yellow");
jbYellow.setBackground(Color.YELLOW);
jbYellow.setToolTipText("黄色");
jbYellow.addActionListener(panelDraw);
myColorBar.add(jbYellow);
JButton jbBlack=new JButton("black");
jbBlack.setBackground(Color.BLACK);
jbBlack.setToolTipText("黑色");
jbBlack.addActionListener(panelDraw);
myColorBar.add(jbBlack);
}
//左侧工具栏构造函数
public void AddToolBar()
{
myToolBar.setFloatable(false);
myToolBar.setBackground(Color.DARK_GRAY);
myToolBar.setLayout(new BorderLayout(5,5));
panelToolBar.setLayout(new GridLayout(6,2,5,10));
panelToolBar.setBackground(Color.PINK);
JLabel lbMsgToolBar1=new JLabel("Tool Bar");
lbMsgToolBar1.setForeground(Color.BLACK);
panelToolBar.add(lbMsgToolBar1);
JLabel lbMsgToolBar2=new JLabel("");
panelToolBar.add(lbMsgToolBar2);
JButton jbPen=new JButton("pen");
jbPen.setToolTipText("钢笔");
panelToolBar.add(jbPen);
JButton jbRect=new JButton("Rect");
jbRect.addActionListener(panelDraw);
jbRect.setToolTipText("画一个矩形");
panelToolBar.add(jbRect);
JButton jbLine=new JButton("Line");
jbLine.addActionListener(panelDraw);
jbLine.setToolTipText("画一条直线");
panelToolBar.add(jbLine);
JButton jbCircle=new JButton("Cricle");
jbCircle.addActionListener(panelDraw);
jbCircle.setToolTipText("画一个圆形");
panelToolBar.add(jbCircle);
JButton jbText=new JButton("A");
jbText.setToolTipText("文本框");
panelToolBar.add(jbText);
JButton jbEraser=new JButton("Eraser");
jbEraser.addActionListener(panelDraw);
jbEraser.setToolTipText("橡皮");
panelToolBar.add(jbEraser);
JButton jbFilled=new JButton("Filled");
jbFilled.addActionListener(panelDraw);
jbFilled.setToolTipText("填充类型");
panelToolBar.add(jbFilled);
JButton jbHollow=new JButton("Hollow");
jbHollow.addActionListener(panelDraw);
jbHollow.setToolTipText("空心类型");
panelToolBar.add(jbHollow);
JButton jbBack=new JButton("<<Back");
jbBack.addActionListener(panelDraw);
jbBack.setToolTipText("撤销");
panelToolBar.add(jbBack);
JButton jbForward=new JButton("Forward>>");
jbForward.addActionListener(panelDraw);
jbForward.setToolTipText("前进");
panelToolBar.add(jbForward);
panelMsgToolBar.setBackground(Color.LIGHT_GRAY);
myToolBar.add(panelToolBar,BorderLayout.NORTH);
myToolBar.add(panelMsgToolBar,BorderLayout.CENTER);
}
// 菜单栏构造函数
public void AddMenu()
{
this.setMenuBar(myMenuBar);
//以下是文件菜单项
Menu fileMenu=new Menu("文件");
myMenuBar.add(fileMenu);
//以下是编辑菜单项
Menu editMenu=new Menu("编辑");
myMenuBar.add(editMenu);
//以下是查看菜单项
Menu viewMenu=new Menu("查看");
myMenuBar.add(viewMenu);
//以下是图像菜单项
Menu picMenu=new Menu("图像");
myMenuBar.add(picMenu);
//以下是颜色菜单项
Menu colorMenu=new Menu("颜色");
myMenuBar.add(colorMenu);
MenuItem red=new MenuItem("red");
red.setShortcut(new MenuShortcut(KeyEvent.VK_R));
colorMenu.add(red);
red.addActionListener(panelDraw);
MenuItem blue=new MenuItem("blue");
blue.setShortcut(new MenuShortcut(KeyEvent.VK_U));
colorMenu.add(blue);
blue.addActionListener(panelDraw);
MenuItem green=new MenuItem("green");
green.setShortcut(new MenuShortcut(KeyEvent.VK_G));
colorMenu.add(green);
green.addActionListener(panelDraw);
MenuItem orange=new MenuItem("orange");
orange.setShortcut(new MenuShortcut(KeyEvent.VK_O));
colorMenu.add(orange);
orange.addActionListener(panelDraw);
MenuItem pink=new MenuItem("pink");
pink.setShortcut(new MenuShortcut(KeyEvent.VK_P));
colorMenu.add(pink);
pink.addActionListener(panelDraw);
MenuItem cyan=new MenuItem("cyan");
cyan.setShortcut(new MenuShortcut(KeyEvent.VK_Y));
colorMenu.add(cyan);
cyan.addActionListener(panelDraw);
MenuItem magenta=new MenuItem("magenta");
magenta.setShortcut(new MenuShortcut(KeyEvent.VK_M));
colorMenu.add(magenta);
magenta.addActionListener(panelDraw);
MenuItem yellow=new MenuItem("yellow");
yellow.setShortcut(new MenuShortcut(KeyEvent.VK_Y));
colorMenu.add(yellow);
yellow.addActionListener(panelDraw);
MenuItem black=new MenuItem("black");
black.setShortcut(new MenuShortcut(KeyEvent.VK_B));
colorMenu.add(black);
black.addActionListener(panelDraw);
//以下是帮助菜单项
Menu helpMenu=new Menu("帮助");
myMenuBar.add(helpMenu);
}
//主函数
public static void main(String [] args)
{
Draw mainFrame=new Draw();
}
}
//以下是画图主面板的定义程序
class MyPanel extends JPanel implements MouseMotionListener, MouseListener, ActionListener
{
int num = 300 ;//每种图形在此程序中最多只能出现的上限
int oo = 0 ;//画笔的当前状态
boolean isFilled=false;//判断是否要填充
int x_tem=0;
int y_tem=0;
//记录器
int randomtp = 0 ; //任意图形
int linetp = 0 ; //线
int recttp = 0 ; //矩形
int cricletp = 0 ; //圆
int texttp = 0 ; //文本
//定义用来保存图像是否填充数组
int[] randomfill=new int[num];
int[] linefill=new int[num];
int[] rectfill=new int[num];
int[] criclefill=new int[num];
int[] textfill=new int[num];
//定义用来保存图象颜色的数组
int[] randomcolor = new int[num];
int[] linecolor = new int[num] ;
int[] rectcolor = new int[num] ;
int[] criclecolor = new int[num] ;
int[] textcolor = new int[num];
//定义用来保存图象数据的数组
int[] randomx1 = new int[num] ;
int[] randomy1 = new int[num] ;
int[] randomx2 = new int[num] ;
int[] randomy2 = new int[num] ;
int[] linex1 = new int[num] ;
int[] liney1 = new int[num] ;
int[] linex2 = new int[num] ;
int[] liney2 = new int[num] ;
int[] rectx1 = new int[num] ;
int[] recty1 = new int[num] ;
int[] rectx2 = new int[num] ;
int[] recty2 = new int[num] ;
int[] criclex1 = new int[num] ;
int[] cricley1 = new int[num] ;
int[] criclex2 = new int[num] ;
int[] cricley2 = new int[num] ;
//构造函数,初始化画笔颜色
MyPanel() {
randomcolor[0] = 9 ;
linecolor[0] = 9 ;
rectcolor[0] = 9 ;
criclecolor[0] = 9 ;
textcolor[0] = 9 ;
}
public void paint(Graphics g){
super.paint(g) ;//刷新界面
this.setBackground(Color.white) ;//设置背景色
this.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)) ;//设置指针样式
//g.drawRect(20,30,40,50);
// 以下是画笔的要画的几种图形的定义。
//实现原理是:将构成各个图形的四个参数(x1,y1,x2,y2)保存至对应的数组。
// 调用repait函数将各个图形画出。
//呵呵,这要感谢ChinaJava上的"爱穿鞋的牛"大虾
// 太牛了,以前每种图形只能画一次。今天解决了(08-04-13)
//画线
for (int i = 0 ; i<linetp + 1 ; i++){
switch (linecolor[i]) {
case 0: g.setColor(Color.red) ; break;
case 1: g.setColor(Color.blue) ; break;
case 2: g.setColor(Color.green) ; break;
case 3: g.setColor(Color.orange) ; break;
case 4: g.setColor(Color.white) ; break ;
case 5: g.setColor(Color.pink) ; break ;
case 6: g.setColor(Color.cyan) ; break ;
case 7: g.setColor(Color.magenta) ; break ;
case 8: g.setColor(Color.yellow) ; break ;
case 9: g.setColor(Color.black) ; break ;
}
g.drawLine(linex1[i] , liney1[i] , linex2[i] , liney2[i]) ;
}
// 画任意图形(未完成)
for (int i = 0 ; i< randomtp + 1 ; i++){
switch (randomcolor[i]) {
case 0: g.setColor(Color.red) ; break;
case 1: g.setColor(Color.blue) ; break;
case 2: g.setColor(Color.green) ; break;
case 3: g.setColor(Color.orange) ; break;
case 4: g.setColor(Color.white) ; break ;
case 5: g.setColor(Color.pink) ; break ;
case 6: g.setColor(Color.cyan) ; break ;
case 7: g.setColor(Color.magenta) ; break ;
case 8: g.setColor(Color.yellow) ; break ;
case 9: g.setColor(Color.black) ; break ;
}
switch(randomfill[i])//选空心还是实心
{
case 0:isFilled=false;break;
case 1:isFilled=true;break;
}
//g.drawLine(linestart.x,linestart.y,randomx2[randomtp],randomy2[randomtp]);
}
//画矩形
for (int i = 0 ; i< recttp + 1 ; i++){
switch (rectcolor[i]) {
case 0: g.setColor(Color.red) ; break;
case 1: g.setColor(Color.blue) ; break;
case 2: g.setColor(Color.green) ; break;
case 3: g.setColor(Color.orange) ; break;
case 4: g.setColor(Color.white) ; break ;
case 5: g.setColor(Color.pink) ; break ;
case 6: g.setColor(Color.cyan) ; break ;
case 7: g.setColor(Color.magenta) ; break ;
case 8: g.setColor(Color.yellow) ; break ;
case 9: g.setColor(Color.black) ; break ;
}
switch(rectfill[i])
{
case 0:isFilled=false;break;
case 1:isFilled=true;break;
}
//判断初始点和终点的位置,要不然方向不对
if(rectx2[i] > rectx1[i])
{
if(recty2[i] > recty1[i])
{
if(isFilled)
{
g.fillRect(rectx1[i] , recty1[i] , rectx2[i] - rectx1[i] , recty2[i] - recty1[i]);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -