- 浏览: 13060 次
- 性别:
最新评论
学习java这段时间一类,对java刚开始的陌生与好奇渐渐的转变为心中有数,遇到的问题总是能够解决的,关键是用什么方法。
对于我来说,老师上课讲的那一套是他们自己的东西,刚开始遇到一些所谓的“专业术语”还感到有点措手不及,但我们学习java更重要的是通过它来
总结出一些自己的学习方法,对我们适用的才是我们需要的。在学习中,我更喜欢将老师讲的一些框框套套和生活中的实际例子结合起来,显得更形象
更简单明了,在运用时显得更有我个人的一些风格,当技术个人化的时候,我们在运用它的时候才会更得心应手。还有就是不懂就要问,然后再不断的
调试,朝自己想要的方式去摸索,这方面很重要,所以现在感觉还是很欠缺。
闲话少说,来小结一下我们的仿XP画图板。
完成画图板,我们首先需要实现它的外观,也就是需要在窗体上添加一些面板、按钮、画布。在初步实现了这些外表的功能之后,我们再去实现画图板
“作画”的功能。
首先,一个画图板是在一个窗体上显示的,然后画板主要分为三个大块儿,分别是画板(DrawPanel)、图形选择面板(ToolPanel)、颜色选择面
板(ColorPanel)。我们需要把窗体设置为边框布局 【BorderLayout()】,届时才能更好的把个面板放在对应的位置。
ToolPanel
图形选择面板大小设置好,布局选用流式布局,不过要调整好按钮的大小,上部分添加的是按钮,然后在按钮上加上图片(自己截的),下面是一个附
加选项面板。先在ToolPanel上添加图形按钮和附加面板,创建图形按钮对象时就对其添加动作监听器(ActionListener)并且设置动作命令,每
当我们点击图形按钮时,就得到动作命令,然后根据不同的动作命令进行判断,再在附加面板上添加附加选择按钮,当然在创建附加选择按钮的同时也
要对其添加另外一个监听器并且设置动作命令。当我们点击附件按钮式,就会得到动作命令,有人会问:"得到动作命令干什么?"先卖个关子,后面详解。
public class ToolPanel extends JToolBar {
//初始化一个ToolPanel面板
public ToolPanel() {
showtool();
}
private String type = "line";
private String item_type = "number_1";
public String gettype() {
return type;
}
public String get_itemtype() {
return item_type;
}
private void showtool() {
this.setBackground(new Color(235,235,235));
this.setPreferredSize(new Dimension(70, 400));
this.setOrientation(javax.swing.JToolBar.VERTICAL);
this.setLayout(new FlowLayout(FlowLayout.LEFT));
LineBorder lineborder = new LineBorder(Color.gray,1);
this.setBorder(lineborder);
String[] array = { "images/brush.jpg", "images/spray.jpg",
"images/pencil.jpg", "images/fillRect.jpg", "images/easer.jpg",
"images/rect.jpg", "images/oval.jpg", "images/line.jpg",
"images/polygon.jpg", "images/roundrect.jpg" };
final JPanel item_panel = new JPanel();
item_panel.setBorder(new BevelBorder(0,Color.GRAY,new Color(192,192,192)));
item_panel.setPreferredSize(new Dimension(60, 70));
item_panel.setLayout(new FlowLayout(FlowLayout.CENTER));
//创建一个附加按钮动作监听器
final ActionListener item_listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
item_type = e.getActionCommand();
//System.out.println(item_type);
}
};
//***********在附加面板上添加选项按钮********************//
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
type = e.getActionCommand();
if (type.equals("line")) {
item_panel.removeAll(); //在显示按钮之前先移除原来添加上去的所有组件
ImageIcon image_1 = new ImageIcon("images/lineSize_1.gif"); //创建一个ImageIcon对象
JButton button_1 = new JButton(image_1); //将图片添加到按钮上
button_1.setBackground(new Color(235,235,235));
button_1.setActionCommand("line_type_1"); //设置动作命令
button_1.addActionListener(item_listener); //为附加按钮添加动作监听器
button_1.setPreferredSize(new Dimension(50, 15)); //设置按钮面积大小
ImageIcon image_2 = new ImageIcon("images/lineSize_2.gif"); //同上
JButton button_2 = new JButton(image_2);
button_2.setBackground(new Color(235,235,235));
button_2.setActionCommand("line_type_2");
button_2.addActionListener(item_listener);
button_2.setPreferredSize(new Dimension(50, 15));
ImageIcon image_3 = new ImageIcon("images/lineSize_3.gif");
JButton button_3 = new JButton(image_3);
button_3.setBackground(new Color(235,235,235));
button_3.setActionCommand("line_type_3");
button_3.addActionListener(item_listener);
button_3.setPreferredSize(new Dimension(50, 15));
item_panel.add(button_1);
item_panel.add(button_2);
item_panel.add(button_3);
item_panel.updateUI(); //强制刷新
}
//下面的操作同上
else if (type.equals("oval")) {
..............
}
else if (type.equals("rect")) {
..............
}
else if (type.equals("roundrect")) {
................
}
else if (type.equals("spray")) {
................
}
else if (type.equals("brush")) {
................
}
else if (type.equals("easer")) {
................
}
else if (type.equals("pencil")){
................
}
else if (type.equals("polygon")){
................
}
}
};
//当按钮比较多的时候就要考虑用for 循环来创建对象统一操作
for (int i = 0; i < array.length; i++) {
ImageIcon image = new ImageIcon(array[i]);
JButton button = new JButton(image);
// 获取图片的名字
String image_name = array[i].substring(array[i].indexOf("/") + 1,
array[i].lastIndexOf(".jpg"));
// 为每一个工具按钮添加动作命令
button.setActionCommand(image_name);
button.setBackground(Color.LIGHT_GRAY);
// 为工具按钮添加监听器
button.addActionListener(listener);
button.setPreferredSize(new Dimension(27, 27));
Insets insets = new Insets(0,0,0,0);
button.setMargin(insets);
if (image_name.equals("pencil")){
button.setSelected(true);
}
this.add(button);
}
this.add(item_panel);
}
}
//***************************************//
//**************************************//
CorlorPanel
将颜色选择面板设置为流式布局,上面有添加了两个面板panel_left、panel_right。 panel_right设置为网格布局,上面主要是颜色选择按钮,
panel_left是前景色按钮和背景色按钮,对panel_right上面的按钮添加MouseListener(因为涉及左右键点击问题),每当左键点击按钮时,就
把当前按钮的颜色赋给背景色按钮,右键则相反。我们最这个类里面有一个获取前景色按钮和背景色按钮比的颜色的方法,“这又用来干嘛呢?”,继续卖关
子。
//初始化一个面板
public ColorPanel() {
showcolorpanel();
}
private Color FColor = Color.WHITE;
private Color BColor = Color.BLACK;
public Color getFColor(){
return FColor;
}
public Color getBColor(){
return BColor;
}
private void showcolorpanel() {
// 设置颜色面板的基本属性
this.setBackground(new Color(235,235,235));
// 设置面板的面积大小
this.setPreferredSize(new Dimension(500, 60));
this.setLayout(new FlowLayout(FlowLayout.LEFT));
// **********************************设置左边的面板*********************************************//
JPanel panel_left = new JPanel();
panel_left.setBorder(new BevelBorder(0,Color.GRAY,new Color(192,192,192)));
panel_left.setBackground(new Color(235,235,235));
panel_left.setPreferredSize(new Dimension(40, 40));
// 绝对布局 自定义坐标(x,y)和大小
panel_left.setLayout(null);
EtchedBorder etchedborder = new EtchedBorder();
final JButton Fbutton = new JButton();
//将按钮设置成不可点击
Fbutton.setEnabled(false);
Fbutton.setFocusable(false);
Fbutton.setBorder(etchedborder);
Fbutton.setBackground(Color.WHITE);
//绝对布局时设置坐标和面积大小
Fbutton.setBounds(15, 15, 18, 18);
final JButton Bbutton = new JButton();
Bbutton.setBorder(etchedborder);
//将按钮设置成不可点击
Bbutton.setEnabled(false);
Bbutton.setFocusable(false);
Bbutton.setBackground(Color.BLACK);
//绝对布局时设置坐标和面积大小
Bbutton.setBounds(5, 5, 18, 18);
panel_left.add(Bbutton);
panel_left.add(Fbutton);
this.add(panel_left);
panel_left.updateUI();
//****************************************设置右面板*******************************************//
JPanel panel_right = new JPanel();
panel_right.setBackground(new Color(235,235,235));
panel_right.setLayout(new GridLayout(2, 10, 1, 1));
Color [] array = { new Color(0,0,0), new Color(128,128,128),
new Color(128, 0, 64), new Color(255,0,0),
new Color(255, 128, 64), new Color(255,255,0),
new Color(0, 128, 0), new Color(0, 128, 255),
new Color(0, 0, 160), new Color(128, 0, 128),
new Color(255, 255, 255),new Color(192, 192, 192),
new Color(128, 64, 0), new Color(255, 128, 192),
new Color(239, 166, 56), new Color(239, 228, 176),
new Color(181, 230, 29), new Color(153, 217, 234),
new Color(112, 146, 190),new Color(200, 191, 231),
};
//因为涉及“左右键”选择颜色,所以用MouseAdapter(一个抽象类,实现了MouseListenre、MouseWheelListener、MouseMotionListener)
//匿名内部类的定义方法
MouseAdapter mouselistener = new MouseAdapter(){
public void mousePressed(MouseEvent e) {
JButton button = new JButton();
button = (JButton) (e.getSource());
if ( e.getButton() == 1){
BColor = button.getBackground();
Bbutton.setBackground(BColor);
}
else if (e.getButton() == 3){
FColor = button.getBackground();
Fbutton.setBackground(FColor);
}
}
};
for (int i = 0; i < array.length; i++) {
JButton button = new JButton();
button.setBackground(array[i]);
button.setBorder(new BevelBorder(0,Color.GRAY,new Color(192,192,192)));
button.addMouseListener(mouselistener);
//设置为不可用
button.setEnabled(false);
button.setPreferredSize(new Dimension(18, 18));
panel_right.add(button);
}
this.add(panel_right);
}
}
//*****************************************//
//*****************************************//
DrawPanel
最终我们是需要在画板面板上作画,需要画布(从面板上获取)、颜色、图形。后两者就是我们为什么要从ToolPanel的到按钮的动作命令、
ColorPanel上得到前景色和背景色按钮的颜色!作图完之后我们需要对其做一个重绘。重写一个继承了JPanel的MyPanel类中paint(Graohics g)
方法。重绘有三种方法(存图、存点、存动作)。
画的同时就把画布上的像素点保存起来
//截屏存储操作
Object object = e.getSource();
JPanel drawpanel = (JPanel)(object);
//获取到drawpanel的左上角相对于屏幕的坐标点
Point point = drawpanel.getLocationOnScreen();
//获取到drawpanel的面积大小
Dimension dimension = drawpanel.getPreferredSize();
//创建一个要截取的区域,相当于是一个屏幕裁剪模具
Rectangle rect = new Rectangle(point,dimension);
//画完一个图形之后就把图像截取下来
BufferedImage cut_image = robot.createScreenCapture(rect);
data = new int[cut_image.getHeight()][cut_image.getWidth()];
for (int i=0;i<data.length;i++)
for (int j=0;j<data[i].length;j++){
int RGB = cut_image.getRGB(j, i);
data[i][j] = RGB;
//System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
}
//*******************************************//
//写一个类继承JPanel,重写JPanel的paint方法
class MyPanel extends JPanel{
// 重写绘制组件的方法
//当然这面板主要是取得画布绘画,没有添加其他组件
//因为JPanel里面的paint方法只会重绘组件,所以我们在“画图”的同时存储画布图像,"它"重绘组件时我们就顺便把图形再画出来
public void paint(Graphics g) {
// 调用父类的绘制方法来正确的绘制组件本身
super.paint(g);
// 当需要重新绘制的时候就将二维数组中的数据绘制一次\
//System.out.println("listener="+listener);
if (listener != null) {
// 获取监听器中的二维数组
int[][] data = listener.data;
//System.out.println("data="+data);
if (data != null) {// 如果已经保存了数据,才需要绘制
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
int cNum = data[i][j];
// 创建颜色对象
Color color = new Color(cNum);
g.setColor(color);
// 绘制点
g.drawLine(j, i, j, i);
}
}
}
}
}
}
至于在画图方面还有一些小技巧,待以后续写~~
发表评论
-
java迷宫
2012-12-05 00:28 936package 迷宫; import java.awt.C ... -
java迷宫
2012-12-05 00:23 0package 迷宫;import java.awt.Colo ... -
java集合框架
2012-07-18 21:30 895java集合框架总结 接口Collection是接口List ... -
java重绘小结
2012-07-16 16:28 5076三种重绘总结: Q:为什么要重绘? A:因为在画板上作画的时 ... -
java关键字小结
2012-07-16 16:21 848关键字总结: public、protected、默认、pr ... -
java自定义队列
2012-07-07 23:15 1104//泛型其实就可以理解为一个模板,至于我们制作模具是倒进去的是 ... -
java简单排序方法总结
2012-07-07 00:41 2441JAVA数组排序有好多种,以下简单对冒泡排序(bu ... -
java基础入门
2012-07-01 19:39 828最近刚开始学习JAVA,感觉还行,就是课程紧了点。表示刚考 ...
相关推荐
这篇博客的文章链接虽然无法直接查看,但从标题我们可以推测它可能是关于Java Canvas的使用经验和技巧的总结。 首先,Java中的Canvas类是一个非常基础的绘图接口,它没有内置的绘图功能,需要开发者自行实现。你...
在本文中,我们将深入探讨如何使用...总结起来,Java实现的画板程序涉及到GUI设计、图形绘制、事件处理、文件操作等多个核心Java技术。通过学习和实践这个项目,开发者可以加深对Java Swing的理解,提升GUI编程能力。
【JAVA画板论文设计】 本篇论文主要探讨的是利用Java编程语言设计并实现一个简易的画图板程序,旨在提供一个基础的图形绘制环境。在Java这个强大的编程平台上,学生可以学习并实践面向对象编程技术,提升软件开发...
总结来说,这个Java画板程序结合了Swing组件、事件监听和图形绘制技术,提供了一个简单的平台供用户进行图形创作。通过对不同形状的绘制函数进行扩展和优化,可以进一步增强这个程序的功能,例如添加更多的图形选项...
总结,"java画板demo"是一个基于Java Swing的简单应用程序,它使用了`Graphics2D`和鼠标事件处理来实现用户可以通过鼠标在画板上自由绘图的功能。这个项目可以帮助开发者学习和掌握Java图形编程的基本概念和技巧。
### JAVA画板实验报告知识点详解 #### 一、实验背景与目标 - **实验名称**:Java画板的设计 - **实验目的**:通过实践掌握Java图形用户界面的设计方法,熟悉`java.awt`包中的组件,并理解委托事件处理模型。 ####...
课程设计JAVA画板模拟画图工具 在本课程设计中,我们将设计一个基于JAVA的画板模拟画图工具,旨在帮助学生和开发者学习和实践JAVA编程语言。下面是本课程设计的详细说明和知识点总结: 课程设计目的 本课程设计的...
总结起来,这个“java的一个画画板”Demo涵盖了Java GUI编程的基础,包括图形绘制、事件处理、坐标系统、颜色选择以及图形交互等多个方面。通过学习和实践这样的项目,开发者可以深入理解Java GUI编程的核心概念,并...
总结起来,这个项目为学习和实践Java GUI编程提供了一个有趣的实例。通过研究源代码,开发者可以了解如何使用Java来创建交互式的图形界面,以及如何实现基本的绘图功能。对于Java初学者或希望增强图形应用开发技能的...
该Java画板程序需要在装有Java Development Kit (JDK) 的环境下运行,推荐使用IDE如Eclipse或IntelliJ IDEA进行开发,操作系统不限,支持Windows、Mac OS X和Linux等。 3.1 系统体系结构设计 系统采用MVC(Model-...
【Java画板课程设计报告】 本报告主要介绍了一个基于Java编程语言实现的仿Windows画板程序,该程序旨在提供一个简单易用的图形绘制环境,包括基本的绘图工具、颜色选择、保存和打开图片等功能。 一、需求分析 1. ...
**绘图板课程设计报告——基于JAVA的实现** 在计算机科学与技术领域,尤其是在软件工程中,课程设计是一项重要的实践环节,它旨在让学生通过实际操作掌握特定编程语言或技术的应用。本报告将深入探讨一个使用Java...
在Java学习过程中,创建一个简单的画图板是一个经典的练习项目,它可以帮助我们深入理解图形用户界面(GUI)的构建和事件处理机制。本篇小结将聚焦于如何使用Java实现一个基本的画图板,同时提供相关的源码分析。 1...
【标题】:“画板总结”通常指的是一个关于图形绘制或设计工具的项目,可能是对一个电子画板软件或在线画图平台的开发经验、功能特点和技术实现的总结。在这个项目中,作者可能分享了他们在创建这样一个画板应用过程...
### 课程设计报告JAVA画板模拟画图工具 #### 1. 课题介绍 ##### 1.1 课程设计目的 本次课程设计的目标是利用Java编程语言开发一款模拟Windows画图程序的应用,该应用能够支持基本的图形图像编辑功能,如创建、修改...
【标题】:“画板保存总结”涉及的知识点主要围绕图形绘制、事件监听和文件操作,这些是计算机图形学和Java编程中的基础概念。 【描述】虽然没有提供具体的内容,但根据“画板保存总结”这一标题,我们可以推测这篇...
Java 画板程序设计实验报告主要涉及以下几个关键知识点: 1. **Java GUI编程**:实验使用了Java的图形用户界面(GUI)库Swing来创建画板程序。`JFrame`是窗口的基础类,用于创建应用程序的主窗口;`Panel`类是组件...
总结一下,这个Java程序的核心知识点包括: 1. Java AWT和Swing库的使用,特别是Graphics类和组件。 2. 自定义绘图:重写`paintComponent`方法,利用`Graphics`对象进行绘图。 3. 鼠标事件处理:添加鼠标监听器,...
在本实验中,我们主要探讨的是“软件体系结构”中的一个具体应用——“画板”设计,使用Java语言实现。这个简易的画板程序具备基本的绘图功能,包括画直线、椭圆(圆)、矩形,以及清除、保存和打开已绘制图形的能力...
这个Java画板程序展示了基本的GUI编程概念,包括组件的创建、布局管理、事件处理等。通过监听用户交互,程序能够动态响应用户的绘画需求,提供了一个简单易用的画图环境。对于初学者来说,这样的项目有助于理解Java...