- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import java.io.*;
- //定义画图的基本图形单元
- public class MiniDrawPad extends JFrame //主类,扩展了JFrame类,用来生成主界面
- {
- private ObjectInputStream input;
- private ObjectOutputStream output; //定义输入输出流,用来调用和保存图像文件
- private JButton choices[]; //按钮数组,存放以下名称的功能按钮
- private String names[] = {
- "New",
- "Open",
- "Save", //这三个是基本操作按钮,包括"新建"、"打开"、"保存"
- /*接下来是我们的画图板上面有的基本的几个绘图单元按钮*/
- "Pencil", //铅笔画,也就是用鼠标拖动着随意绘图
- "Line", //绘制直线
- "Rect", //绘制空心矩形
- "fRect", //绘制以指定颜色填充的实心矩形
- "Oval", //绘制空心椭圆
- "fOval", //绘制以指定颜色填充的实心椭圆
- "Circle", //绘制圆形
- "fCircle", //绘制以指定颜色填充的实心圆形
- "RoundRect", //绘制空心圆角矩形
- "frRect", //绘制以指定颜色填充的实心圆角矩形
- "Rubber", //橡皮擦,可用来擦去已经绘制好的图案
- "Color", //选择颜色按钮,可用来选择需要的颜色
- "Stroke", //选择线条粗细的按钮,输入需要的数值可以实现绘图线条粗细的变化
- "Word" //输入文字按钮,可以在绘图板上实现文字输入
- };
- private String styleNames[] = {
- " 宋体 ", " 隶书 ", " 华文彩云 ", " 仿宋_GB2312 ", " 华文行楷 ",
- " 方正舒体 ", " Times New Roman ", " Serif ", " Monospaced ",
- " SonsSerif ", " Garamond "
- }; //可供选择的字体项
- //当然这里的灵活的结构可以让读者自己随意添加系统支持的字体
- private Icon items[];
- private String tipText[] = {
- //这里是鼠标移动到相应按钮上面上停留时给出的提示说明条
- //读者可以参照上面的按钮定义对照着理解
- "Draw a new picture",
- "Open a saved picture",
- "Save current drawing",
- "Draw at will",
- "Draw a straight line",
- "Draw a rectangle",
- "Fill a ractangle",
- "Draw an oval",
- "Fill an oval",
- "Draw a circle",
- "Fill a circle",
- "Draw a round rectangle",
- "Fill a round rectangle",
- "Erase at will",
- "Choose current drawing color",
- "Set current drawing stroke",
- "Write down what u want"
- };
- JToolBar buttonPanel; //定义按钮面板
- private JLabel statusBar; //显示鼠标状态的提示条
- private DrawPanel drawingArea; //画图区域
- private int width = 800, height = 550; //定义画图区域初始大小
- drawings[] itemList = new drawings[5000]; //用来存放基本图形的数组
- private int currentChoice = 3; //设置默认画图状态为随笔画
- int index = 0; //当前已经绘制的图形数目
- private Color color = Color.black; //当前画笔颜色
- int R, G, B; //用来存放当前色彩值
- int f1, f2; //用来存放当前字体风格
- String style1; //用来存放当前字体
- private float stroke = 1.0f; //设置画笔粗细,默认值为1.0f
- JCheckBox bold, italic; //定义字体风格选择框
- //bold为粗体,italic为斜体,二者可以同时使用
- JComboBox styles;
- public MiniDrawPad() //构造函数
- {
- super("Drawing Pad");
- JMenuBar bar = new JMenuBar(); //定义菜单条
- JMenu fileMenu = new JMenu("File");
- fileMenu.setMnemonic('F');
- //新建文件菜单条
- JMenuItem newItem = new JMenuItem("New");
- newItem.setMnemonic('N');
- newItem.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- newFile(); //如果被触发,则调用新建文件函数段
- }
- });
- fileMenu.add(newItem);
- //保存文件菜单项
- JMenuItem saveItem = new JMenuItem("Save");
- saveItem.setMnemonic('S');
- saveItem.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- saveFile(); //如果被触发,则调用保存文件函数段
- }
- });
- fileMenu.add(saveItem);
- //打开文件菜单项
- JMenuItem loadItem = new JMenuItem("Load");
- loadItem.setMnemonic('L');
- loadItem.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- loadFile(); //如果被触发,则调用打开文件函数段
- }
- });
- fileMenu.add(loadItem);
- fileMenu.addSeparator();
- //退出菜单项
- JMenuItem exitItem = new JMenuItem("Exit");
- exitItem.setMnemonic('X');
- exitItem.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- System.exit(0); //如果被触发,则退出画图板程序
- }
- });
- fileMenu.add(exitItem);
- bar.add(fileMenu);
- //设置颜色菜单条
- JMenu colorMenu = new JMenu("Color");
- colorMenu.setMnemonic('C');
- //选择颜色菜单项
- JMenuItem colorItem = new JMenuItem("Choose Color");
- colorItem.setMnemonic('O');
- colorItem.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- chooseColor(); //如果被触发,则调用选择颜色函数段
- }
- });
- colorMenu.add(colorItem);
- bar.add(colorMenu);
- //设置线条粗细菜单条
- JMenu strokeMenu = new JMenu("Stroke");
- strokeMenu.setMnemonic('S');
- //设置线条粗细菜单项
- JMenuItem strokeItem = new JMenuItem("Set Stroke");
- strokeItem.setMnemonic('K');
- strokeItem.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- setStroke();
- }
- });
- strokeMenu.add(strokeItem);
- bar.add(strokeMenu);
- //设置提示菜单条
- JMenu helpMenu = new JMenu("Help");
- helpMenu.setMnemonic('H');
- //设置提示菜单项
- JMenuItem aboutItem = new JMenuItem("About this Drawing Pad!");
- aboutItem.setMnemonic('A');
- aboutItem.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- JOptionPane.showMessageDialog(null,
- "This is a mini drawing pad!/nCopyright (c) 2002 Tsinghua University ",
- " 画图板程序说明 ",
- JOptionPane.INFORMATION_MESSAGE);
- }
- });
- helpMenu.add(aboutItem);
- bar.add(helpMenu);
- items = new ImageIcon[names.length];
- //创建各种基本图形的按钮
- drawingArea = new DrawPanel();
- choices = new JButton[names.length];
- buttonPanel = new JToolBar(JToolBar.VERTICAL);
- buttonPanel = new JToolBar(JToolBar.HORIZONTAL);
- ButtonHandler handler = new ButtonHandler();
- ButtonHandler1 handler1 = new ButtonHandler1();
- //导入我们需要的图形图标,这些图标都存放在与源文件相同的目录下面
- for (int i = 0; i < choices.length; i++) {//items[i]=new ImageIcon( MiniDrawPad.class.getResource(names[i] +".gif"));
- //如果在jbuilder下运行本程序,则应该用这条语句导入图片
- items[i] = new ImageIcon(names[i] + ".gif");
- //默认的在jdk或者jcreator下运行,用此语句导入图片
- choices[i] = new JButton("", items[i]);
- choices[i].setToolTipText(tipText[i]);
- buttonPanel.add(choices[i]);
- }
- //将动作侦听器加入按钮里面
- for (int i = 3; i < choices.length - 3; i++) {
- choices[i].addActionListener(handler);
- }
- choices[0].addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- newFile();
- }
- });
- choices[1].addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- loadFile();
- }
- });
- choices[2].addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- saveFile();
- }
- });
- choices[choices.length - 3].addActionListener(handler1);
- choices[choices.length - 2].addActionListener(handler1);
- choices[choices.length - 1].addActionListener(handler1);
- //字体风格选择
- styles = new JComboBox(styleNames);
- styles.setMaximumRowCount(8);
- styles.addItemListener(
- new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- style1 = styleNames[styles.getSelectedIndex()];
- }
- });
- //字体选择
- bold = new JCheckBox("BOLD");
- italic = new JCheckBox("ITALIC");
- checkBoxHandler cHandler = new checkBoxHandler();
- bold.addItemListener(cHandler);
- italic.addItemListener(cHandler);
- JPanel wordPanel = new JPanel();
- buttonPanel.add(bold);
- buttonPanel.add(italic);
- buttonPanel.add(styles);
- styles.setMinimumSize(new Dimension(50, 20));
- styles.setMaximumSize(new Dimension(100, 20));
- Container c = getContentPane();
- super.setJMenuBar(bar);
- c.add(buttonPanel, BorderLayout.NORTH);
- c.add(drawingArea, BorderLayout.CENTER);
- statusBar = new JLabel();
- c.add(statusBar, BorderLayout.SOUTH);
- statusBar.setText(" Welcome To The Little Drawing Pad!!! :)");
- createNewItem();
- setSize(width, height);
- show();
- }
- //按钮侦听器ButtonHanler类,内部类,用来侦听基本按钮的操作
- public class ButtonHandler implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- for (int j = 3; j < choices.length - 3; j++) {
- if (e.getSource() == choices[j]) {
- currentChoice = j;
- createNewItem();
- repaint();
- }
- }
- }
- }
- //按钮侦听器ButtonHanler1类,用来侦听颜色选择、画笔粗细设置、文字输入按钮的操作
- public class ButtonHandler1 implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- if (e.getSource() == choices[choices.length - 3]) {
- chooseColor();
- }
- if (e.getSource() == choices[choices.length - 2]) {
- setStroke();
- }
- if (e.getSource() == choices[choices.length - 1]) {
- JOptionPane.showMessageDialog(null,
- "Please hit the drawing pad to choose the word input position",
- "Hint", JOptionPane.INFORMATION_MESSAGE);
- currentChoice = 14;
- createNewItem();
- repaint();
- }
- }
- }
- //鼠标事件mouseA类,继承了MouseAdapter,用来完成鼠标相应事件操作
- class mouseA extends MouseAdapter {
- public void mousePressed(MouseEvent e) {
- statusBar.setText(" Mouse Pressed @:[" + e.getX() +
- ", " + e.getY() + "]");//设置状态提示
- itemList[index].x1 = itemList[index].x2 = e.getX();
- itemList[index].y1 = itemList[index].y2 = e.getY();
- //如果当前选择的图形是随笔画或者橡皮擦,则进行下面的操作
- if (currentChoice == 3 || currentChoice == 13) {
- itemList[index].x1 = itemList[index].x2 = e.getX();
- itemList[index].y1 = itemList[index].y2 = e.getY();
- index++;
- createNewItem();
- }
- //如果当前选择的图形式文字输入,则进行下面操作
- if (currentChoice == 14) {
- itemList[index].x1 = e.getX();
- itemList[index].y1 = e.getY();
- String input;
- input = JOptionPane.showInputDialog(
- "Please input the text you want!");
- itemList[index].s1 = input;
- itemList[index].x2 = f1;
- itemList[index].y2 = f2;
- itemList[index].s2 = style1;
- index++;
- currentChoice = 14;
- createNewItem();
- drawingArea.repaint();
- }
- }
- public void mouseReleased(MouseEvent e) {
- statusBar.setText(" Mouse Released @:[" + e.getX() +
- ", " + e.getY() + "]");
- if (currentChoice == 3 || currentChoice == 13) {
- itemList[index].x1 = e.getX();
- itemList[index].y1 = e.getY();
- }
- itemList[index].x2 = e.getX();
- itemList[index].y2 = e.getY();
- repaint();
- index++;
- createNewItem();
- }
- public void mouseEntered(MouseEvent e) {
- statusBar.setText(" Mouse Entered @:[" + e.getX() +
- ", " + e.getY() + "]");
- }
- public void mouseExited(MouseEvent e) {
- statusBar.setText(" Mouse Exited @:[" + e.getX() +
- ", " + e.getY() + "]");
- }
- }
- //鼠标事件mouseB类继承了MouseMotionAdapter,用来完成鼠标拖动和鼠标移动时的相应操作
- class mouseB extends MouseMotionAdapter {
- public void mouseDragged(MouseEvent e) {
- statusBar.setText(" Mouse Dragged @:[" + e.getX() +
- ", " + e.getY() + "]");
- if (currentChoice == 3 || currentChoice == 13) {
- itemList[index - 1].x1 = itemList[index].x2 = itemList[index].x1 = e.getX();
- itemList[index - 1].y1 = itemList[index].y2 = itemList[index].y1 = e.getY();
- index++;
- createNewItem();
- } else {
- itemList[index].x2 = e.getX();
- itemList[index].y2 = e.getY();
- }
- repaint();
- }
- public void mouseMoved(MouseEvent e) {
- statusBar.setText(" Mouse Moved @:[" + e.getX() +
- ", " + e.getY() + "]");
- }
- }
- //选择字体风格时候用到的事件侦听器类,加入到字体风格的选择框中
- private class checkBoxHandler implements ItemListener {
- public void itemStateChanged(ItemEvent e) {
- if (e.getSource() == bold) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- f1 = Font.BOLD;
- } else {
- f1 = Font.PLAIN;
- }
- }
- if (e.getSource() == italic) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- f2 = Font.ITALIC;
- } else {
- f2 = Font.PLAIN;
- }
- }
- }
- }
- //画图面板类,用来画图
- class DrawPanel extends JPanel {
- public DrawPanel() {
- setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
- setBackground(Color.white);
- addMouseListener(new mouseA());
- addMouseMotionListener(new mouseB());
- }
- @Override
- public void paintComponent(Graphics g) {
- super.paintComponent(g);
- Graphics2D g2d = (Graphics2D) g; //定义画笔
- int j = 0;
- while (j <= index) {
- draw(g2d, itemList[j]);
- j++;
- }
- }
- void draw(Graphics2D g2d, drawings i) {
- i.draw(g2d);//将画笔传入到各个子类中,用来完成各自的绘图
- }
- }
- //新建一个画图基本单元对象的程序段
- void createNewItem() {
- if (currentChoice == 14)//进行相应的游标设置
- {
- drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
- } else {
- drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
- }
- switch (currentChoice) {
- case 3:
- itemList[index] = new Pencil();
- break;
- case 4:
- itemList[index] = new Line();
- break;
- case 5:
- itemList[index] = new Rect();
- break;
- case 6:
- itemList[index] = new fillRect();
- break;
- case 7:
- itemList[index] = new Oval();
- break;
- case 8:
- itemList[index] = new fillOval();
- break;
- case 9:
- itemList[index] = new Circle();
- break;
- case 10:
- itemList[index] = new fillCircle();
- break;
- case 11:
- itemList[index] = new RoundRect();
- break;
- case 12:
- itemList[index] = new fillRoundRect();
- break;
- case 13:
- itemList[index] = new Rubber();
- break;
- case 14:
- itemList[index] = new Word();
- break;
- }
- itemList[index].type = currentChoice;
- itemList[index].R = R;
- itemList[index].G = G;
- itemList[index].B = B;
- itemList[index].stroke = stroke;
- }
- //选择当前颜色程序段
- public void chooseColor() {
- color = JColorChooser.showDialog(MiniDrawPad.this,
- "Choose a color", color);
- R = color.getRed();
- G = color.getGreen();
- B = color.getBlue();
- itemList[index].R = R;
- itemList[index].G = G;
- itemList[index].B = B;
- }
- //选择当前线条粗细程序段
- public void setStroke() {
- String input;
- input = JOptionPane.showInputDialog(
- "Please input a float stroke value! ( >0 )");
- stroke = Float.parseFloat(input);
- itemList[index].stroke = stroke;
- }
- //保存图形文件程序段
- public void saveFile() {
- JFileChooser fileChooser = new JFileChooser();
- fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
- int result = fileChooser.showSaveDialog(this);
- if (result == JFileChooser.CANCEL_OPTION) {
- return;
- }
- File fileName = fileChooser.getSelectedFile();
- fileName.canWrite();
- if (fileName == null || fileName.getName().equals("")) {
- JOptionPane.showMessageDialog(fileChooser, "Invalid File Name",
- "Invalid File Name", JOptionPane.ERROR_MESSAGE);
- } else {
- try {
- fileName.delete();
- FileOutputStream fos = new FileOutputStream(fileName);
- output = new ObjectOutputStream(fos);
- drawings record;
- output.writeInt(index);
- for (int i = 0; i < index; i++) {
- drawings p = itemList[i];
- output.writeObject(p);
- output.flush(); //将所有图形信息强制转换成父类线性化存储到文件中
- }
- output.close();
- fos.close();
- } catch (IOException ioe) {
- ioe.printStackTrace();
- }
- }
- }
- //打开一个图形文件程序段
- public void loadFile() {
- JFileChooser fileChooser = new JFileChooser();
- fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
- int result = fileChooser.showOpenDialog(this);
- if (result == JFileChooser.CANCEL_OPTION) {
- return;
- }
- File fileName = fileChooser.getSelectedFile();
- fileName.canRead();
- if (fileName == null || fileName.getName().equals("")) {
- JOptionPane.showMessageDialog(fileChooser, "Invalid File Name",
- "Invalid File Name", JOptionPane.ERROR_MESSAGE);
- } else {
- try {
- FileInputStream fis = new FileInputStream(fileName);
- input = new ObjectInputStream(fis);
- drawings inputRecord;
- int countNumber = 0;
- countNumber = input.readInt();
- for (index = 0; index < countNumber; index++) {
- inputRecord = (drawings) input.readObject();
- itemList[index] = inputRecord;
- }
- createNewItem();
- input.close();
- repaint();
- } catch (EOFException endofFileException) {
- JOptionPane.showMessageDialog(this, "no more record in file",
- "class not found", JOptionPane.ERROR_MESSAGE);
- } catch (ClassNotFoundException classNotFoundException) {
- JOptionPane.showMessageDialog(this, "Unable to Create Object",
- "end of file", JOptionPane.ERROR_MESSAGE);
- } catch (IOException ioException) {
- JOptionPane.showMessageDialog(this, "error during read from file",
- "read Error", JOptionPane.ERROR_MESSAGE);
- }
- }
- }
- //新建一个文件程序段
- public void newFile() {
- index = 0;
- currentChoice = 3;
- color = Color.black;
- stroke = 1.0f;
- createNewItem();
- repaint();//将有关值设置为初始状态,并且重画
- }
- //主函数段
- public static void main(String args[]) {
- try {
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- } catch (Exception e) {
- }//将界面设置为当前windows风格
- MiniDrawPad newPad = new MiniDrawPad();
- newPad.addWindowListener(
- new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- System.exit(0);
- }
- });
- }
- }
- class drawings implements Serializable//父类,基本图形单元,用到串行化接口,保存时所用
- {
- int x1, y1, x2, y2; //定义坐标属性
- int R, G, B; //定义色彩属性
- float stroke; //定义线条粗细属性
- int type; //定义字体属性
- String s1;
- String s2; //定义字体风格属性
- void draw(Graphics2D g2d) {
- }
- ;//定义绘图函数
- }
- /*******************************************************************************
- 下面是各种基本图形单元的子类,都继承自父类drawings,请仔细理解继承的概念
- ********************************************************************************/
- class Line extends drawings //直线类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke,
- BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
- g2d.drawLine(x1, y1, x2, y2);
- }
- }
- class Rect extends drawings//矩形类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke));
- g2d.drawRect(Math.min(x1, x2), Math.min(y1, y2),
- Math.abs(x1 - x2), Math.abs(y1 - y2));
- }
- }
- class fillRect extends drawings//实心矩形类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke));
- g2d.fillRect(Math.min(x1, x2), Math.min(y1, y2),
- Math.abs(x1 - x2), Math.abs(y1 - y2));
- }
- }
- class Oval extends drawings//椭圆类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke));
- g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),
- Math.abs(x1 - x2), Math.abs(y1 - y2));
- }
- }
- class fillOval extends drawings//实心椭圆
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke));
- g2d.fillOval(Math.min(x1, x2), Math.min(y1, y2),
- Math.abs(x1 - x2), Math.abs(y1 - y2));
- }
- }
- class Circle extends drawings//圆类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke));
- g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),
- Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),
- Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));
- }
- }
- class fillCircle extends drawings//实心圆
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke));
- g2d.fillOval(Math.min(x1, x2), Math.min(y1, y2),
- Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),
- Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));
- }
- }
- class RoundRect extends drawings//圆角矩形类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke));
- g2d.drawRoundRect(Math.min(x1, x2), Math.min(y1, y2),
- Math.abs(x1 - x2), Math.abs(y1 - y2),
- 50, 35);
- }
- }
- class fillRoundRect extends drawings//实心圆角矩形类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke));
- g2d.fillRoundRect(Math.min(x1, x2), Math.min(y1, y2),
- Math.abs(x1 - x2), Math.abs(y1 - y2),
- 50, 35);
- }
- }
- class Pencil extends drawings//随笔画类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setStroke(new BasicStroke(stroke,
- BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
- g2d.drawLine(x1, y1, x2, y2);
- }
- }
- class Rubber extends drawings//橡皮擦类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(255, 255, 255));
- g2d.setStroke(new BasicStroke(stroke + 4,
- BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
- g2d.drawLine(x1, y1, x2, y2);
- }
- }
- class Word extends drawings//输入文字类
- {
- void draw(Graphics2D g2d) {
- g2d.setPaint(new Color(R, G, B));
- g2d.setFont(new Font(s2, x2 + y2, ((int) stroke) * 18));
- if (s1 != null) {
- g2d.drawString(s1, x1, y1);
- }
- }
- }
相关推荐
Java项目——画图软件
简介 作者简介:青铜码农,和大多数同学一样从零开始一步步学习,一步步积累。期待您的关注,让我们一起成长~注:本人学疏才浅,文章如有错误之处,敬请指正~ 本章节内容简介:仿Windows系统自带的画图工具。此项目包含了设置画笔粗细、选择画笔颜色、选择背景颜色、绘制图像、清除图像、使用橡皮擦、简笔画窗口等功能。 所需技术如下图: 功能预览: 画图完整版视频 功能结构: 搭建项目 01导入资源 02创建DrawPictureFrame窗体类 03创建DrawPictureCanv.
用Java写一个画图工具
我们在每次画图时,每个图形都有一个对应的列表,即ArrayList类,直线的列表里面存了四个元素,分别为x1,y1,x2,y2,根据这两点的坐标即可复现直线。同理,矩形对应的列表也有四个元素,三角形对应的列表有六个元素(3个坐标),而多边形和曲线就有很多坐标。以下是一些要设置的量与构造函数。接下来我们实现画图功能,我们鼠标监听器的监听按照:按下->松开->点击 这个顺序直线:在第一次点击时,获得点击坐标,然后移动鼠标松开到终点。获得终点坐标即可将两点相连。
JAVA简单画图程序
1.JFrame窗体界面(JButton、Graphics、Graphics2D、Color) 创建一个Draw类,在主函数中实例化Draw类,并调用Ondraw方法 public class Draw{ public static void main(String[] args) { //在主函数中,实例化Draw类的对象,调用初始化界面的方法 Dra...
Java学习—画图程序项目(2)
使用java进行画图程序的编写,记录并巩固对Java的学习。
CVE-2025-25249漏洞深度解析:FortiOS认证绕过与实战缓解
远程代码执行(RCE)是网络安全中最危险的漏洞类型之一,其核心往往源于认证机制失效或内存安全缺陷。CVE-2025-25249正属于此类高危漏洞——它不依赖用户凭证,也不需要交互触发,而是通过超长HTTP头(如X-Forwarded-For)引发内存越界写入,直接绕过FortiOS和FortiSwitchManager的完整认证流程。该漏洞影响广泛、CVSS评分高达9.8,凸显了嵌入式设备在HTTP协议栈实现中的深层风险。在企业网络中,FortiGate等设备常作为边界守门人,一旦失陷将导致root级控制权
自制非接触式静电探测仪:从振动电容原理到微弱信号检测实践
微弱信号检测是电子测量领域的核心挑战之一,尤其在需要避免物理接触或防止干扰的场景中。其基本原理在于将难以直接获取的微小物理量(如电流、电压)通过传感器转换为电信号,再经过放大、滤波等处理进行提取。锁相放大技术是解决这一问题的关键手段,它利用参考信号与目标信号的同步性,从强噪声背景中恢复出有效信息,极大提升了信噪比和测量灵敏度。这项技术的工程价值在于实现了对纳安级电流、微伏级电压等高难度参数的可靠测量。在静电防护、材料表面电位分析、生物电信号采集等应用场景中,非接触式测量需求广泛。本文聚焦的基于振动电容原理的
用JAVA写一个画图小程序(JAVA 大作业)
JAVA GUI 编写画图程序,实现文件读取,图形绘画,颜色变换,粗细调整等等操作
基于AXI PCIE IP的FPGA PCIE卡示意图
如果在上图中的AXI互联IP上再连接一个带AXI Slave接口的BRAM控制器,这个BRAM控制器连接一个BRAM,Host PC在系统主存中分配了一些不连续的内存,Host PC可以将这些内存段的起始地址(当然要先转为PCIE总线地址)写到AXI总线上的BRAM中,这样AXI CDMA读取BRAM,将读取到的PCIE总线基地址写到AXIPCIE寄存器块中的AXIBAR2PCIEBAR_n寄存器中,这样就实现了SG DMA。通过动态改变AXIBAR2PCIEBAR_n寄存器的值,可以实现多通道DMA。
用JAVA写一个画图程序(课程设计)
GUI设计,实现基本图形绘画、线条改变、橡皮擦、毛笔、喷枪、颜色调换、文件保存打开、窗口设计等功能
手把手教你用CEFSharp打造防关联指纹浏览器(附完整代码)
本文详细介绍了如何基于CEFSharp框架,从零开始构建一个企业级的防关联指纹浏览器。通过剖析核心架构、多进程隔离实现、动态指纹混淆(如Canvas、WebGL)的实战代码,以及代理集成与性能优化,为跨境电商、广告投放等场景提供了一套可控、安全的开源解决方案。
WCK Operation (WCK 操作)
LPDDR6 SDRAM采用双时钟系统(WCK和CK),其中WCK频率是CK的两倍。为确保数据正确传输,需通过WCK2CK同步操作使两种时钟对齐。LPDDR6支持两种同步模式:Auto-sync off模式和WCK Always on模式,可通过MR22寄存器选择。同步操作由特定命令(Read/Write/MRR等)触发,需在满足特定时序参数(如tWCKENL、tWCKPRE等)后完成。同步前必须完成WCK2CK训练,且不同操作(读取/写入/CAS)有各自的时序要求。该机制确保数据在正确时钟相位下传输,是L
自己写了一个简单的画图程序
没事儿了,正好上学期学了MFC,编写了一个简单的画图程序,大家可以下载看看
heygem本地部署报错:SQLite3 can only bind numbers, strings, bigints, buffers, and null...如何解决?
🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀! 📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位大厂资深架构师和一线开发多年实战经验沉淀,
用JAVA制作一个画图程序
在日常生活中画图软件给我们带来了许多便利,往大了说可以用它来制作图标,往小了说也可以当做一个涂鸦板消磨时间。 比如:制作个图标  ...
在 SAP 中修改 Profile 文件中的主机名需要谨慎操作,需需确保所有相关配置保持一致
在SAP系统中修改Profile文件主机名需谨慎操作,主要步骤包括:1)停止相关SAP服务;2)重命名并编辑实例级Profile文件(如ER1_D00_OLDHOST改为ER1_D00_LRPSAP),修改所有含旧主机名的参数;3)可选更新默认Profile文件;4)在Windows系统中调整注册表配置;5)验证一致性后重启服务。关键注意:保持大小写统一、修改前备份文件、集群环境需同步所有节点。通过系统日志确认新主机名生效且无报错。
python爬虫项目(一百九十八):电商平台用户行为数据分析与推荐系统、爬取电商平台用户行为数据
本文详细介绍了如何通过爬虫技术抓取电商平台的用户行为数据,并结合数据分析技术,构建一个简单的推荐系统。使用Selenium模拟用户操作抓取动态网页数据,并通过API接口直接获取用户行为数据,能够为后续的用户行为分析提供基础数据。我们结合了基于用户协同过滤、基于商品协同过滤和矩阵分解等方法,构建了不同的推荐系统。实际应用中,可以进一步优化推荐算法,利用更复杂的深度学习技术和更高效的数据处理方法,提升推荐的准确性和个性化程度。
用java写一个简易画图板
目标是实现一个简单的画板,可以通过点击上方的按钮改变要画的形状,颜色。大致效果如下图一、画图板界面实现所需用到的主要API类:JFrame,JButton,FlowLayout,Graphics以及一些相关的类;先创建窗体,设置相关属性,再添加按钮。import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;...
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
用JAVA做一个简单的画图软件
#用JAVA做一个简单的画图软件 写在前面 第一次用Java写东西,未免有疏漏之处,请多多指正。 首先,建立画布。 这里利用JFrame窗体界面创建一个DrawerFrame类,在主函数中实例化DrawerFrame类,并调用showUI方法,画出程序的基本框架。 public class DrawerFrame { public static void main(String[] args){ DrawerFrame df= new DrawerFrame(); df.showUI(); }
锂电池充电器电路设计 里面有电路
锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
用java写一个简单的画图板
Hello,大家好,这是我的第二篇博客,写的是如何创作一个画图板;因为我以前写的代码都是用dev-C++写的控制台程序,这次学习了JFrame等容器,就想写个画图工具练练手,这一篇我讲的可能会细碎一点。 首先我们要做一个可视化界面,用JFrame类即可, ...
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
画图程序 java_一个JAVA画图程序
近期根据视频教程搞了一个JAVA画图程序,做了一个太阳系模型的源码。涉及到一些AWT和面向对象的东西。详细来看一下吧。先来看一下效果吧: 基本的画图理论就省略了。要实现该程序关键有二个通用的程序:一、继承Frame的一个窗口初始化程序public class MyFrame extends Frame {public void LaunchFrame() {setSize(Constants.F...
推荐两款程序员必备的画图神器
缘起 最近经常有伙伴问我,作为程序员,有没有好的画图工具推荐,领导说Microsoft Visio画图工具很强,让我们使用,但是我就是用的不习惯。还有没有其他高端的牛逼的,容易上手,一用就爽的画图工具么。 针对这么个问题,我其实也是经验不足,Microsoft Visio我也用过,安装包大,还要破解,用的不多,还买个正版,我的脑子还没瓦塌,我是不会买的。 那么趁着周末给大家分享两款好用的画图工具,作为程序员还是经常需要画一画图的,你应该能明白我说的画图指的是什么,我也就不过多的强调了。 还是强调下吧: 1、
一个Java画图板程序的设计
本文讲述一个画图板应用程序的设计,屏幕抓图如下。这篇文章带有三个附件,其中两个jar文件都是j2sdk1.4.2_08编译打包,包含源代码,可执行,如下表: 附件名称及链接 详情 jDraw_basic.jar 本文是基
Java画图程序设计
<br /><br />本文讲述一个画图板应用程序的设计,屏幕抓图如下:<br /><br />『IShape』<br />这是所有图形类(此后称作模型类)都应该实现接口,外部的控制类,比如画图板类就通过这个接口跟模型类“交流”。名字开头的I表示它是一个接口(Interface),这是eclipse用的一个命名法则,觉得挺有用的,就借鉴来了。这个接口定义了两个方法:<br /> view plaincopy to clipboardprint?public void draw(java.awt.Graphi
Java中实现画图程序
图形的绘制与保存重绘
如何用java创建一个画图板(一)
用java创建一个画图板,实现直线、矩形、圆的绘画。
5587



被折叠的 条评论
为什么被折叠?



