Java画图板

huangjie15280829562 2013-05-06 08:04:45
我做的画图板很简单,就是把工具和颜色选择放到了同一个JFrame里面了
我只实现了画线功能(确切的说是用连续的点拼成的线)

对鼠标事件和各种事件不太懂。
现在只想实现基本的画直线,矩形和椭圆以及橡皮擦和重绘功能
下面是我的代码
可以指点一下,或者直接跟我说任何实现就好,就是鼠标按下去和起来的坐标如何获得
//主类
public class DrawingPad extends JFrame {
//界面设置
private JPanel colorPanel;
private JPanel toolPanel;
private DrawSpace drawPanel;
private JButton buttons[];
private JButton colorButton;

private Color penColor=Color.black;
//画图用的有关变量
private int pointCount=0;
private Point[] points=new Point[10000];
//跟花直线,矩形有关的东西
Point dots[] = new Point[1000];
int dot=0;
int ys=0;
int dx=0;
int flag=0;
int startx,starty,endx,endy,height,width,chanx,chany;
//构造函数
public DrawingPad ()
{//工具板,颜色板以及画板的添加和设置
setLayout(null);
toolPanel=new JPanel();
toolPanel.setBounds(0, 0, 100, 450);

add(toolPanel);
buttons=new JButton[5];
buttons[0]=new JButton("Line");
toolPanel.add(buttons[0]);

buttons[1]=new JButton("Rect");
toolPanel.add(buttons[1]);

buttons[2]=new JButton("Oval");
toolPanel.add(buttons[2]);
ButtonHandler handler = new ButtonHandler();
buttons[3]=new JButton("Eraser");
toolPanel.add(buttons[3]);
buttons[3].addActionListener( handler );

buttons[4]=new JButton("Repaint");
//想实现重绘功能,但失败
buttons[4].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == buttons[4])
repaint();
}
});
toolPanel.add(buttons[4]);

colorPanel=new JPanel();
colorPanel.setBounds(0, 450, 600, 120);


add(colorPanel);
//颜色选择板
colorPanel.setLayout( new GridLayout());
colorButton=new JButton("Click to Choose the Colr of pen");
colorButton.setFont(new Font("隶书", Font.BOLD,25));
// colorButton.setBorder(BorderFactory.createRaisedBevelBorder());

colorButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
penColor = JColorChooser.showDialog(DrawingPad .this,
"choose a color ", penColor);

if (penColor == null)
penColor = Color.black;

}
});

colorPanel.add(colorButton);

drawPanel=new DrawSpace ();
drawPanel.setBounds(100, 0, 500, 450);
drawPanel.setBackground(Color.white);
add(drawPanel);

createMenuBar();
//创建ArrayList

}//button事件想通过点button实现画矩形的功能,有待实现
private class ButtonHandler implements ActionListener
{
// handle button event
public void actionPerformed( ActionEvent event )
{
// clearRect
} // end method actionPerformed
} // end private inner class ButtonHandler
public void mouseDragged(MouseEvent e)
{
}
//创建菜单
public void createMenuBar()
{
//创建一个JMenuBar放置菜单
JMenuBar menuBar=new JMenuBar();
String[] menuArr={"文件(F)","查看(V)","颜色(C)","帮助(H)"};
String[][] menuItemArr={
{"新建(N)","打开(O)","保存(S)","-","退出(E)"},
{"工具箱(T)","颜料盒(C)"},
{"编辑颜色"},
{"帮助主题","关于"}

};
for(int i=0;i<menuArr.length;i++)
{
JMenu menu=new JMenu(menuArr[i]);
for(int j=0;j<menuItemArr[i].length;j++)
{
if(menuItemArr[i][j].equals("-"))
{
//menu.addSeprator();
}
else
{
JMenuItem menuItem=new JMenuItem(menuItemArr[i][j]);
//menuItem.addActionListener(menuListener);
menu.add(menuItem);

}
}
menuBar.add(menu);
}

this.setJMenuBar(menuBar);
}
//画图板的重写
public class DrawSpace extends JPanel
{//可以实现画连续的点
public DrawSpace()
{
// handle frame mouse motion event
addMouseMotionListener(

new MouseMotionAdapter() // anonymous inner class
{
// store drag coordinates and repaint
public void mouseDragged( MouseEvent event )
{
if ( pointCount < points.length )
{
points[ pointCount ] = event.getPoint(); // find point
++pointCount; // increment number of points in array
repaint(); // repaint JFrame
} // end if
} // end method mouseDragged
} // end anonymous inner class
); // end call to addMouseMotionListener
} // end PaintPanel constructor

// draw ovals in a 4-by-4 bounding box at specified locations on window
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // clears drawing area

// draw all points in array
for ( int i = 0; i < pointCount; i++ )
{g.fillOval( points[ i ].x, points[ i ].y, 4, 4 );

g.setColor(penColor);}
} // end method paintComponent


}

}
...全文
65 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
从零开始讲述Java多线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从多线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现多线程。 课程目标:    快速上手掌握Java多线程的经典课程,    系统、全面、深入掌握Java多线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计会遇到哪些坑、如何才能做出最合适的架构设计,经验最难得!适应人群:    想要系统、深入学习Java多线程    已有Java开发基础,想要快速掌握Java多线程    补充Java多线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是多线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:死锁、饥饿、活锁,图示    3:线程的性能问题,这里主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleep 和yield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleep和yield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这里是《Java并发编程与源码分析》的第一部分——讲述多线程核心基础实现快速上手多线程的经典之作   

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧