本文目录一览:
java画图问题
因为程序初始化的时候会自动调用paint()
方法,而你没有进行重写。在加入
public void paint(Graphics g) {
}
这样的一段代码后,在运行程序,会看到一个蓝色边框的长方形,橘黄色的实体长方形和粉红色的依次横向排列。但是,经测试,并不是每一次都能正确的初始化,所以建议画图操作尽量在上述方法中进行操作。
如何用java实现画图
使用Java的Graphics
类进行绘图。
Graphics
类提供基本的几何图形绘制方法,主要有:画线段、画矩形、画圆、画带颜色的图形、画椭圆、画圆弧、画多边形等。
用Java一个简单的画图程序
下面是我以前做的小程序,希望能给你点帮助!
package menu;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DaYin extends JFrame implements ActionListener {
public DaYin() {
Container c = this.getContentPane();
c.setLayout(new BorderLayout());
JMenuBar jmb = new JMenuBar();
JMenu jm = null;
jm = new JMenu("文件");
jmb.add(jm);
jm = new JMenu("编辑");
jmb.add(jm);
jm = new JMenu("打印");
JMenuItem jmi = new JMenuItem("打印预览");
jmi.addActionListener(this);
jm.add(jmi);
jmb.add(jm);
jm = new JMenu("帮助");
jmb.add(jm);
this.setJMenuBar(jmb);
this.setSize(1024, 768);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new DaYin();
}
public void update(Graphics g) {
g.setColor(Color.black);
String title[] = {"摘要", "科目", "子目或户名", "借方金额", "贷方金额"};
String danwei[] = {"千", "百", "十", "万", "千", "百", "十", "元", "角", "分"};
int csx = 200; // 打印x的初始坐标
int csy = 200; // 打印y的初始坐标
int x = csx;
int y = csy;
int a = x + 20; // 打印字体x的初始坐标
int b = y + 20; // 打印字体y的初始坐标
int row = 7; // 一共打印出几条横线
int cul = 5; // 一共打印出几条竖线
int hangju = 30; // 线与线之间的纵向间距
int lieju = 100; // 线与线之间的横向间距
int yy = hangju * row + y;
int c = yy + 20;
g.setFont(new Font("行楷", Font.TYPE1_FONT, 24));
g.drawString("记 账 凭 证", x + 160, y - 40); // 打印出记账凭证这几个字
g.drawLine(x + 100, y - 30, x + 340, y - 30); // 打印出记账凭证下面的那条线
g.setFont(new Font("行楷", Font.TYPE1_FONT, 13));
g.drawString("年 月 日 第_______号", x + 260, y - 10);
// g.drawLine(x+430, y-10, x+470, y-10);
for (int i = 0; i <= row; i++) {
g.drawLine(x, y, cul * lieju + x + 25, y); // 此循环用于画出表格的行
if (i == 0)
y += hangju * 2;
else
y += hangju;
}
y = csy;
g.drawLine(x + lieju * 3, y + hangju, cul * lieju + x, y + hangju); // 打印出第一行半的横线
for (int j = 0; j <= cul; j++) {
g.drawLine(x, y, x, row * hangju + y); // 此循环用于画出表格的列
x += lieju;
}
x = csx;
for (int z = 0; z < cul; z++) {
g.setColor(Color.red); // 设置颜色
g.setFont(new Font("", Font.TYPE1_FONT, 13)); // 设置表头字体
if (z < 3)
g.drawString(title[z], a, b + hangju / 2);
else
g.drawString(title[z], a, b); // 为表格添加表头
a += lieju;
} // 76-89打印出一个表格形状
int xx = lieju * 3 + x + 10;
for (int v = 0; v <= 9; v++) {
g.drawLine(xx, y + hangju, xx, row * hangju + y + hangju); // 此循环用于画出表格的列
g.setFont(new Font("", Font.TYPE1_FONT, 11));
g.drawString(danwei[v], xx - 10, y + hangju + 20); // 为表格添加表头
if (v % 2 == 0)
g.setColor(Color.red); // 设置颜色
else
g.setColor(Color.BLUE); // 设置颜色
xx += 10;
}
for (int n = 0; n < 9; n++) {
g.drawLine(xx, y + hangju, xx, row * hangju + y + hangju); // 此循环用于画出表格的列
g.drawString(danwei[n], xx - 10, y + hangju + 20); // 为表格添加表头
if (n % 2 == 0)
g.setColor(Color.red); // 设置颜色
else
g.setColor(Color.BLUE); // 设置颜色
xx += 10;
}
g.drawString(danwei[9], xx - 10, y + hangju + 20);
g.setColor(Color.black); // 设置颜色
for (int i = 0; i <= 1; i++) {
g.drawLine(x, yy, cul * lieju + x, yy); // 此循环用于画出表格的行
yy += hangju;
}
yy = hangju * row + y;
for (int j = 0; j <= 3; j++) {
g.drawLine(x, yy, x, (row + 1) * hangju + y); // 此循环用于画出表格的列
if (j > 0) {
x += lieju;
} else {
x += lieju * 3;
}
} // 112-128打印出表格的最后一行单元格
x = csx;
g.setFont(new Font("", Font.TYPE1_FONT, 13));
g.drawString("合 计", x + 60, c);
g.drawString("会计主管 记账 出纳 审核 制证", x + 30, yy + 50);
g.drawLine(cul * lieju + x + 25, y, cul * lieju + x + 25, (row + 1) * hangju + y); // 打印出最后一列
g.drawString("记", cul * lieju + x + 6, y + 15);
g.drawString("账", cul * lieju + x + 6, y + 35);
g.drawString("√", cul * lieju + x + 6, y + 55); // 134-136为最后一列写入字体
g.drawString("附", cul * lieju + x + 35, y + 75);
g.drawString("件", cul * lieju + x + 35, y + 95);
g.drawString("张", cul * lieju + x + 35, y + 175); // 134-136为最后一列后写入字体
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getActionCommand().equals("打印预览")) {
this.repaint();
}
}
}
使用drawLine()
做了一个记账凭证。
执行点击"打印"子菜单"打印预览"就可显示出我们所画的"记账凭证表"。
希望这个小程序能够给你点灵感。
java 实现 简单画图功能(简单点的)
楼主给你一个我编的,直接保存成pb.java
编译运行,就是你要的画图功能
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.awt.geom.*;
import java.io.*;
import java.util.Vector;
class Point implements Serializable {
int x, y;
Color col;
int tool;
int boarder;
Point(int x, int y, Color col, int tool, int boarder) {
this.x = x;
this.y = y;
this.col = col;
this.tool = tool;
this.boarder = boarder;
}
}
class paintboard extends Frame implements ActionListener, MouseMotionListener, MouseListener, ItemListener {
int x = -1, y = -1;
int con = 1; // 画笔大小
int Econ = 5; // 橡皮大小
int toolFlag = 0; // toolFlag:工具标记
// toolFlag工具对应表:
// (0--画笔);(1--橡皮);(2--清除);
// (3--直线);(4--圆);(5--矩形);
Color c = new Color(0, 0, 0); // 画笔颜色
BasicStroke size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); // 画笔粗细
Point cutflag = new Point(-1, -1, c, 6, con); // 截断标志
Vector<Point> paintInfo = null; // 点信息向量组
int n = 1;
FileInputStream picIn = null;
FileOutputStream picOut = null;
ObjectInputStream VIn = null;
ObjectOutputStream VOut = null;
// *工具面板--画笔,直线,圆,矩形,多边形,橡皮,清除*/
Panel toolPanel;
Button eraser, drLine, drCircle, drRect;
Button clear, pen;
Choice ColChoice, SizeChoice, EraserChoice;
Button colchooser;
Label 颜色, 大小B, 大小E;
// 保存功能
Button openPic, savePic;
FileDialog openPicture, savePicture;
paintboard(String s) {
super(s);
addMouseMotionListener(this);
addMouseListener(this);
paintInfo = new Vector<>();
/*各工具按钮及选择项*/
// 颜色选择
ColChoice = new Choice();
ColChoice.add("black");
ColChoice.add("red");
ColChoice.add("blue");
ColChoice.add("green");
ColChoice.addItemListener(this);
// 画笔大小选择
SizeChoice = new Choice();
SizeChoice.add("1");
SizeChoice.add("3");
SizeChoice.add("5");
SizeChoice.add("7");
SizeChoice.add("9");
SizeChoice.addItemListener(this);
// 橡皮大小选择
EraserChoice = new Choice();
EraserChoice.add("5");
EraserChoice.add("9");
EraserChoice.add("13");
EraserChoice.add("17");
EraserChoice.addItemListener(this);
//////////////////////////////////////////////////////
toolPanel = new Panel();
clear = new Button("清除");
eraser = new Button("橡皮");
pen = new Button("画笔");
drLine = new Button("画直线");
drCircle = new Button("画圆形");
drRect = new Button("画矩形");
openPic = new Button("打开图画");
savePic = new Button("保存图画");
colchooser = new Button("显示调色板");
// 各组件事件监听
clear.addActionListener(this);
eraser.addActionListener(this);
pen.addActionListener(this);
drLine.addActionListener(this);
drCircle.addActionListener(this);
drRect.addActionListener(this);
openPic.addActionListener(this);
savePic.addActionListener(this);
colchooser.addActionListener(this);
颜色 = new Label("画笔颜色", Label.CENTER);
大小B = new Label("画笔大小", Label.CENTER);
大小E = new Label("橡皮大小", Label.CENTER);
// 面板添加组件
toolPanel.add(openPic);
toolPanel.add(savePic);
toolPanel.add(pen);
toolPanel.add(drLine);
toolPanel.add(drCircle);
toolPanel.add(drRect);
toolPanel.add(颜色);
toolPanel.add(ColChoice);
toolPanel.add(大小B);
toolPanel.add(SizeChoice);
toolPanel.add(colchooser);
toolPanel.add(eraser);
toolPanel.add(大小E);
toolPanel.add(EraserChoice);
toolPanel.add(clear);
// 工具面板到APPLET面板
add(toolPanel, BorderLayout.NORTH);
setBounds(60, 60, 900, 600);
setVisible(true);
validate();
// dialog for save and load
openPicture = new FileDialog(this, "打开图画", FileDialog.LOAD);
openPicture.setVisible(false);
savePicture = new FileDialog(this, "保存图画", FileDialog.SAVE);
savePicture.setVisible(false);
openPicture.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
openPicture.setVisible(false);
}
});
savePicture.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
savePicture.setVisible(false);
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Point p1, p2;
n = paintInfo.size();
if (toolFlag == 2)
g.clearRect(0, 0, getSize().width, getSize().height); // 清除
for (int i = 0; i < n; i++) {
p1 = paintInfo.elementAt(i);
p2 = paintInfo.elementAt(i + 1);
size = new BasicStroke(p1.boarder, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
g2d.setColor(p1.col);
g2d.setStroke(size);
if (p1.tool == p2.tool) {
switch (p1.tool) {
case 0: // 画笔
Line2D line1 = new Line2D.Double(p1.x, p1.y, p2.x, p2.y);
g2d.draw(line1);
break;
case 1: // 橡皮
g.clearRect(p1.x, p1.y, p1.boarder, p1.boarder);
break;
case 3: // 画直线
Line2D line2 = new Line2D.Double(p1.x, p1.y, p2.x, p2.y);
g2d.draw(line2);
break;
case 4: // 画圆
Ellipse2D ellipse = new Ellipse2D.Double(p1.x, p1.y, Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y));
g2d.draw(ellipse);
break;
case 5: // 画矩形
Rectangle2D rect = new Rectangle2D.Double(p1.x, p1.y, Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y));
g2d.draw(rect);
break;
case 6: // 截断,跳过
i = i + 1;
break;
default:
} // end switch
} // end if
} // end for
}
public void itemStateChanged(ItemEvent e) {
if (e.getSource() == ColChoice) { // 预选颜色
String name = ColChoice.getSelectedItem();
if (name == "black")
c = new Color(0, 0, 0);
else if (name == "red")
c = new Color(255, 0, 0);
else if (name == "green")
c = new Color(0, 255, 0);
else if (name == "blue")
c = new Color(0, 0, 255);
} else if (e.getSource() == SizeChoice) { // 画笔大小
String selected = SizeChoice.getSelectedItem();
if (selected == "1") {
con = 1;
size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
} else if (selected == "3") {
con = 3;
size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
} else if (selected == "5") {
con = 5;
size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
} else if (selected == "7") {
con = 7;
size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
} else if (selected == "9") {
con = 9;
size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
}
} else if (e.getSource() == EraserChoice) { // 橡皮大小
String Esize = EraserChoice.getSelectedItem();
if (Esize == "5")
Econ = 5 * 2;
else if (Esize == "9")
Econ = 9 * 2;
else if (Esize == "13")
Econ = 13 * 2;
else if (Esize == "17")
Econ = 17 * 3;
}
}
public void mouseDragged(MouseEvent e) {
Point p1;
switch (toolFlag) {
case 0: // 画笔
x = (int) e.getX();
y = (int) e.getY();
p1 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p1);
repaint();
break;
case 1: // 橡皮
x = (int) e.getX();
y = (int) e.getY();
p1 = new Point(x, y, null, toolFlag, Econ);
paintInfo.addElement(p1);
repaint();
break;
default:
}
}
public void mouseMoved(MouseEvent e) {
}
public void update(Graphics g) {
paint(g);
}
public void mousePressed(MouseEvent e) {
Point p2;
switch (toolFlag) {
case 3: // 直线
x = (int) e.getX();
y = (int) e.getY();
p2 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p2);
break;
case 4: // 圆
x = (int) e.getX();
y = (int) e.getY();
p2 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p2);
break;
case 5: // 矩形
x = (int) e.getX();
y = (int) e.getY();
p2 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p2);
break;
default:
}
}
public void mouseReleased(MouseEvent e) {
Point p3;
switch (toolFlag) {
case 0: // 画笔
paintInfo.addElement(cutflag);
break;
case 1: // 橡皮
paintInfo.addElement(cutflag);
break;
case 3: // 直线
x = (int) e.getX();
y = (int) e.getY();
p3 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p3);
paintInfo.addElement(cutflag);
repaint();
break;
case 4: // 圆
x = (int) e.getX();
y = (int) e.getY();
p3 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p3);
paintInfo.addElement(cutflag);
repaint();
break;
case 5: // 矩形
x = (int) e.getX();
y = (int) e.getY();
p3 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p3);
paintInfo.addElement(cutflag);
repaint();
break;
default:
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == pen) // 画笔
toolFlag = 0;
if (e.getSource() == eraser) // 橡皮
toolFlag = 1;
if (e.getSource() == clear) { // 清除
toolFlag = 2;
paintInfo.removeAllElements();
repaint();
}
if (e.getSource() == drLine) // 画线
toolFlag = 3;
if (e.getSource() == drCircle) // 画圆
toolFlag = 4;
if (e.getSource() == drRect) // 画矩形
toolFlag = 5;
if (e.getSource() == colchooser) { // 调色板
Color newColor = JColorChooser.showDialog(this, "调色板", c);
c = newColor;
}
if (e.getSource() == openPic) { // 打开图画
openPicture.setVisible(true);
if (openPicture.getFile() != null) {
int tempflag;
tempflag = toolFlag;
toolFlag = 2;
repaint();
try {
paintInfo.removeAllElements();
File filein = new File(openPicture.getDirectory(), openPicture.getFile());
picIn = new FileInputStream(filein);
VIn = new ObjectInputStream(picIn);
paintInfo = (Vector<Point>) VIn.readObject();
VIn.close();
repaint();
toolFlag = tempflag;
} catch (ClassNotFoundException IOe2) {
repaint();
toolFlag = tempflag;
System.out.println("can not read object");
} catch (IOException IOe) {
repaint();
toolFlag = tempflag;
System.out.println("can not read file");
}
}
}
if (e.getSource() == savePic) { // 保存图画
savePicture.setVisible(true);
try {
File fileout = new File(savePicture.getDirectory(), savePicture.getFile());
picOut = new FileOutputStream(fileout);
VOut = new ObjectOutputStream(picOut);
VOut.writeObject(paintInfo);
VOut.close();
} catch (IOException IOe) {
System.out.println("can not write object");
}
}
}
} // end paintboard
public class pb {
public static void main(String args[]) {
new paintboard("画图程序");
}
}
JAVA的画图小程序
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
class MyLine {
private int x1, x2, y1, y2;
public MyLine(int x1, int x2, int y1, int y2) {
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}
public void drawMe(Graphics g) {
g.drawLine(x1, y1, x2, y2);
g.drawString("起始坐标:" + new String(x1 + "," + y1), x1, y1);
}
}
public class DrawLine extends Frame {
Vector<MyLine> v = new Vector<>();
public static void main(String[] args) {
DrawLine dl = new DrawLine();
dl.init();
}
public void paint(Graphics g) {
g.setColor(Color.BLUE);
Enumeration<MyLine> en = v.elements();
while (en.hasMoreElements()) {
MyLine m = en.nextElement();
m.drawMe(g);
}
}
public void init() {
setSize(300, 300);
setVisible(true);
addMouseListener(new MouseAdapter() {
int x1, x2, y1, y2;
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
Graphics g = e.getComponent().getGraphics();
g.setColor(Color.BLUE);
g.drawLine(x1, y1, x2, y2);
g.drawString(new String("起始点坐标:" + x1 + "," + y1), x1, y1);
v.add(new MyLine(x1, x2, y1, y2)); // here pay attention
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
((Window) e.getSource()).dispose();
System.exit(0);
}
});
}
}
关于java中画图形的paint方法
代码如下:
/**分析下例:我们只是new了一个对象并没有调用Paint()方法那为什么会画出图呢?
* Graphics这个类的对象就是一只画笔,当某容器调用paint()时就会在该容器中画图。
* 当窗口产生时本身就存在一只画笔,我们只需要拿到画笔重写Paint()便可以随心作画。
* 每次需要重画的时候就会自动调用paint(Graphics g)(什么时候需要重画呢?如当窗口被覆盖又重新置顶时,当窗口最小化又最大化时等等)
*/
总结:我们想要在容器中画图时只需要做的就是:在该容器中重写Paint()
,系统会自动传给我们画笔,自动调用paint
方法按照我们的意愿进行作画。
public class TestGraphics extends Frame {
public static void main(String[] args) {
new TestGraphics("画图", 100, 100, 200, 200, Color.white);
}
public TestGraphics(String s, int x, int y, int w, int h, Color c) {
super(s);
this.setBounds(x, y, w, h);
this.setBackground(c);
this.setVisible(true);
}
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.magenta);
g.fillOval(100, 100, 50, 50);
g.setColor(Color.green);
g.fill3DRect(60, 100, 50, 50, false);
g.setColor(c);
}
}
小例子2:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
/**
* 原理是:在Frame中增加成员变量-容器ArrayList,用它来容纳点,每次点击鼠标就触发了事件:往容器中添加一个点,然后立即调用repaint方法强制画出容器中所有的点来
* 所以我们利用容器来"装"点,然后通过iterator来遍历画出所有的点。
* 适配器类:使用适配器类可以只重写我们需要的方法
* 因为这些适配器类都已经实现了相应的接口即把所有的方法都空实现了一遍 我们只需要重写我们需要的方法即可
* repaint -调用- update() - 调用 - paint();
*/
public class MyFrame extends Frame {
ArrayList<Point> al; // 泛型指定容器中只能放入Point
public MyFrame(String s) {
super(s);
al = new ArrayList<>();
this.setBounds(100, 100, 200, 200);
this.setBackground(Color.darkGray);
this.setVisible(true);
this.addMouseListener(new MouseAdapter() { // 匿名类
@Override
public void mousePressed(MouseEvent e) {
MyFrame f = (MyFrame) e.getSource(); // e是事件,e.getSource()是获取事件源即窗口 f
f.al.add(new Point(e.getX(), e.getY())); // 而e.getX(),e.getY()则是获取事件发生的x,y坐标
repaint(); // 每次点击鼠标触发事件时都有了新的点,所以强制要求重画,才能立刻显示出该点否则只有窗口被最小化又最大化后才能看到刚才的点
}
});
// 匿名类:在参数处我们传递的是new WindowAdapter() {匿名类体} );他没有名字,我们把它当成WindowAdapter来用,为什么可以这样呢?因为语法上规定了匿名类要么是实现了前面的接口,要么是从前面的类继承,就着前面父类的名字来写类体。当此类与其他类关系不大时可以用匿名类
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void paint(Graphics g) {
Iterator<Point> it = al.iterator(); // 泛型指定取出元素时只能是point
while (it.hasNext()) {
Point p = it.next(); // 由于使用泛型这时候就不用强制转换了
Color c = g.getColor(); // 保护原有颜色
g.setColor(Color.pink);
g.fillOval(p.x - 6, p.y - 6, 12, 12);
g.setColor(c);
}
}
public static void main(String[] args) {
new MyFrame("点击");
}
}