Java版画板的实现方法

Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现。
基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘。(文章较长,但是代码是逐步递进的,可以按三部分分开来看,实现了当前部分再去看下一部分。)首先是画板的界面实现,因为我没有去找具体的图标,界面上的所有组件都是Swing的自带组件,所以界面略微有点简陋,不过如果想要优化也简单,把界面上的组件都改成自定义的图标即可。界面实现后,就可以考虑给界面的组件加上监听,不同的图形根据具体情况添加不同的监听方法。然后编写事件处理类依据不同的图形编写画图的具体算法。一个简易版本的画图板基本就差不多可以实现了。重绘这里先不提放到后面再讲。

先来看看画图界面的实现:

实现画图界面需要用的API类主要有:FlowLayout,GridLayout,Color,Dimension,JButton,JFrame,JPanel。

定义Draw类,让Draw类继承JFrame。设置它的大小,标题,可见性等。需要注意的是这里如果添加的按钮如果比较多,建议使用数组来完成按钮的添加,因为如果直接一个一个的加按钮,不仅会使得代码量增大,而且不利于查找、添加和代码的维护。为了使得界面不至于显得那么简陋,这里使用了几个Jpanel,和不同的布局管理器。主窗体使用的是流式布局管理器,然后使用三个面板,分别承装图形按钮,颜色按钮和画布。承装图形按钮和颜色按钮的面板都使用表格布局。然后界面的实现就基本完成了。

package Cbs;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Draw类,用于界面的初始化
 * @author CBS
 */
@SuppressWarnings("serial")
public class Draw extends JFrame {
  // 界面初始化方法
  public void showUI() {
    setTitle("画图");//窗体名称
    setSize(1200, 900);//窗体大小
    setDefaultCloseOperation(3);
    setLocationRelativeTo(null);//窗体居中
        //流式布局左对齐
    FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
    setLayout(layout);//窗体使用流式布局管理器
    this.setResizable(false);//窗体大小不变

    //使用数组保存按钮名
    String buttonName[] = { "画直线", "画椭圆", "画曲线", "多边形",
         "橡皮擦", "拖动线","三角形", "画球形", "笔刷", "喷枪",
         "色子", "立体矩形", "立体圆", "立体三角","迭代分形",
          "现代分形", "枫叶", "画树", "mandelbrot集", "L-System",
         "迭代画线","迭代三角形", "谢尔宾斯基地毯", "画字符", "清空",
         "吸管" ,"矩形","五角星","多线","字符"};
        //用于保存图形按钮,使用网格布局
    JPanel jp1=new JPanel(new GridLayout(15, 2,10,10));
    jp1.setPreferredSize(new Dimension(200, 800));

    //循环为按钮面板添加按钮
    for (int i = 0; i < buttonName.length; i++) {
      JButton jbutton = new JButton(buttonName[i]);
      jp1.add(jbutton);
    }

    JPanel jp2=new JPanel();//画布面板
    jp2.setPreferredSize(new Dimension(970, 800));
    jp2.setBackground(Color.WHITE);

    // 定义Color数组,用来存储按钮上要显示的颜色信息
    Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED,
            Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,
            Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,
            Color.LIGHT_GRAY,Color.YELLOW};
    //用于保存颜色按钮的面板
    JPanel jp3=newJPanel(newGridLayout(1,colorArray.length,3,3));
    // 循环遍历colorArray数组,根据数组中的元素来实例化按钮对象
    for (int i = 0; i < colorArray.length; i++) {
      JButton button = new JButton();
      button.setBackground(colorArray[i]);
      button.setPreferredSize(new Dimension(30, 30));
      jp3.add(button);
    }
    //将面板添加到主窗体
    this.add(jp1);
    this.add(jp2);
    this.add(jp3);
    //添加按钮,作为当前颜色
    JButton nowColor=new JButton();
    nowColor.setPreferredSize(new Dimension(40,40));
    nowColor.setBackground(Color.BLACK);//默认黑色
    add(nowColor);
        //设置窗体的组件可见,如果为FALSE就看不到任何组件
    setVisible(true);
  }

}

这里还要一点要注意的地方,Jpanel面板的添加先后顺序不要改变,这是根据流式布局算出来的面板大小,读者可以自行更改调试。还有一个就是窗体的setSize方法只对窗体本身有效,如果要改变其他组件的大小要用setPreferredSize方法。这样画图板的基本界面就实现。界面的按钮和面板可以根据自身需要更改。
这是界面的大概样子:

监听的实现:

当然我们空有个界面并没有什么用,我们需要的是点击不同的按钮能够实现不同的功能。这里就需要用到事件的监听机制了。实现监听的主要API类有: ActionListener,MouseListener,MouseMotionListener。添加事件监听的方法根以前的步骤是一样的:确定事件源对象,编写事件处理类,添加监听方法。画图板中的事件源对象有两种,一种是按钮,另一种就是画布的面板,按钮使用的是ActionListener,而画布面板因为负责的是绘图,所以使用的是MouseListener和MouseMotionListener。为了实现事件的监听,我们需要定义一个事件处理类DrawListener,该类实现了以上的三个事件接口。之后在重写的方法中实现不同图形的绘制。图形的绘制都可以通过Graphics对象的方法来实现。但是这里有一个问题,如何分辨在Draw类中按下的是哪个按钮呢?在定义Draw类的时候,我们使用了图形按钮和颜色按钮,图形类的按钮在实例化对象的时候是使用了带参数的构造方法的,也就是图形按钮都是有文字的,而颜色按钮则没有。依据这一点就可以很容易的区分不同的按钮了。

DrawListener类:

package Cbs;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;

public class DrawListener implements ActionListener, MouseListener,
    MouseMotionListener {
  private Color color;//颜色属性
  private Graphics g;//画笔属性
  private String str;//保存按钮上的字符串,区分不同的按钮
  private int x1,y1,x2,y2;//(x1,y1),(x2,y2)分别为鼠标的按下和释放时的坐标
  private JButton nowColor;//当前颜色按钮

  //获取Draw类的画笔对象
  public void setG(Graphics g) {
    this.g = g;
  }
  //获取当前颜色按钮
  public void setNowColor(JButton nowColor) {
    this.nowColor = nowColor;
  }

  @Override
  //鼠标拖动的方法
  public void mouseDragged(MouseEvent e) {
    //画曲线的方法
    if ("画曲线".equals(str)) {
      int x, y;
      x = e.getX();
      y = e.getY();
      g.drawLine(x, y, x1, y1);
      x1 = x;
      y1 = y;
    }
  }

  @Override
  //鼠标移动方法
  public void mouseMoved(MouseEvent e) {

  }

  @Override
  //鼠标单击方法
  public void mouseClicked(MouseEvent e) {

  }

  @Override
  //鼠标按下方法
  public void mousePressed(MouseEvent e) {

    g.setColor(color);//改变画笔的颜色

    x1=e.getX();//获取按下时鼠标的x坐标
    y1=e.getY();//获取按下时鼠标的y坐标
  }

  @Override
  //鼠标释放方法
  public void mouseReleased(MouseEvent e) {
    x2=e.getX();//获取释放时鼠标的x坐标
    y2=e.getY();//获取释放时鼠标的y坐标
    //画直线的方法
    if ("画直线".equals(str)) {
      g.drawLine(x1, y1, x2, y2);
    }
  }

  @Override
  //鼠标进入方法
  public void mouseEntered(MouseEvent e) {

  }

  @Override
  //鼠标退出方法
  public void mouseExited(MouseEvent e) {

  }

  @Override
  //处理按钮上的鼠标点击动作
  public void actionPerformed(ActionEvent e) {
    //判断是颜色按钮还是图形按钮
    if ("".equals(e.getActionCommand())) {
      JButton jb = (JButton) e.getSource();
      color = jb.getBackground();
      nowColor.setBackground(color);//处理当前颜色
    } else {
      str = e.getActionCommand();
    }
  }

}

Draw类也要做一些修改,为按钮和面板添加监听:

package Cbs;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Draw类,用于界面的初始化
 * @author CBS
 */
@SuppressWarnings("serial")
public class Draw extends JFrame {
  private DrawListener dl;
  private Graphics g;
  // 界面初始化方法
  public void showUI() {
    setTitle("画图");//窗体名称
    setSize(1200, 900);//窗体大小
    setDefaultCloseOperation(3);
    setLocationRelativeTo(null);//窗体居中
        //流式布局左对齐
    FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
    setLayout(layout);//窗体使用流式布局管理器
    this.setResizable(false);//窗体大小不变

    //使用数组保存按钮名
    String buttonName[] = { "画直线", "画椭圆", "画曲线", "多边形",
           "橡皮擦", "拖动线","三角形", "画球形", "笔刷", "喷枪",
           "色子", "立体矩形", "立体圆", "立体三角","迭代分形",
            "现代分形", "枫叶", "画树", "mandelbrot集", "L-System",
            "迭代画线","迭代三角形", "谢尔宾斯基地毯", "画字符", "清空",
           "吸管" ,"矩形","五角星","多线","字符"};
        //用于保存图形按钮,使用网格布局
    JPanel jp1=new JPanel(new GridLayout(15, 2,10,10));
    jp1.setPreferredSize(new Dimension(200, 800));

    //实例化DrawListener对象
    dl=new DrawListener();
    //循环为按钮面板添加按钮
    for (int i = 0; i < buttonName.length; i++) {
      JButton jbutton = new JButton(buttonName[i]);
      jbutton.addActionListener(dl);//为按钮添加监听
      jp1.add(jbutton);
    }

    JPanel jp2=new JPanel();//画布面板
    jp2.setPreferredSize(new Dimension(970, 800));
    jp2.setBackground(Color.WHITE);

    // 定义Color数组,用来存储按钮上要显示的颜色信息
    Color[] colorArray = { Color.BLUE, Color.GREEN,
          Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,
          Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,Color.LIGHT_GRAY,
          Color.YELLOW};
    //用于保存颜色按钮的面板
    JPanel jp3=new JPanel(new GridLayout(1,colorArray.length,3,3));
    // 循环遍历colorArray数组,根据数组中的元素来实例化按钮对象
    for (int i = 0; i < colorArray.length; i++) {
      JButton button = new JButton();
      button.setBackground(colorArray[i]);
      button.setPreferredSize(new Dimension(30, 30));
      button.addActionListener(dl);//为按钮添加监听
      jp3.add(button);
    }
    //将面板添加到主窗体
    this.add(jp1);
    this.add(jp2);
    this.add(jp3);
    //添加按钮,作为当前颜色
    JButton nowColor=new JButton();
    nowColor.setPreferredSize(new Dimension(40,40));
    nowColor.setBackground(Color.BLACK);//默认黑色
    add(nowColor);
    //设置窗体的组件可见,如果为FALSE就看不到任何组件
    setVisible(true);
    //获取画笔对象
    g=jp2.getGraphics();
    dl.setG(g);
    dl.setNowColor(nowColor);
    //为面板添加鼠标监听,用于绘制图形
    jp2.addMouseListener(dl);
    jp2.addMouseMotionListener(dl);
  }

}

drawDrawListener里面只写了画直线和曲线的方法,读者可以根据自己的需求添加,思路和方式都是一样的。Draw类里面有些需要注意的地方在这里提一下:一个是画笔g的获取一定要在窗体的可见之后采取获取,不然获取的画笔对象返回值会是null。二是要为图形按钮添加监听,DrawListener的实例化需要在setVisible方法之前,所以不建议使用构造方法直接传入g画笔参数,我使用的是set方法。最后是注意一下使用哪个添加方法,按钮使用的是addActionListener方法,画板面板使用的是addMouseListener和addMouseMotionListener方法。使用画板面板来获取画笔并给画面面板添加监听是为了让绘图的时候图形不会跑出面板外,这里的画笔和监听都由主窗体获得也是可以的,不过绘制时会出现线画出面板的问题。

画板的重绘:

到这里画板的制作已经基本实现了,我们已经可以在上面绘制各种各样的图形了。但是细心的人可能会发现一个问题,那就是如果把窗体最小化之后再次打开,画板上原本已经画好的东西会全部都消失了。这样子肯定是不行的,辛辛苦苦画的“大作”怎么能说说没就没了呢。那么为什么会出现这样的问题呢?要回答这个问题我们就需要先了解Java的绘图机制。做画图板我们使用的是Swing组件,这套组件是基于原先的AWT组件开发,在绘制的时候会调用系统的画图函数,这就是为什么我们可以从面板或者是窗体中获取画笔对象的原因。这也就是说Java中你所能够看到窗体,按钮或者其它的所有组件其实都是画出来。所以当我们点击窗体使它最小化或者改变大小的时候,原来的画的窗体就不能适应需要了,这时系统会调用JFrame的paint方法实现窗体的重绘,也就是再次画了一个新的窗体,而JFrame的paint方法只对窗体已经添加的组件有效,我们自己绘制的东西并没有写在paint方法里面,所以窗体重绘之后,我们原先绘制的图形也就消失了。要解决这个问题我们需要重写父类的paint方法。但是这样的话问题又来了,画图是在DrawListener类里面实现的,要怎么把它们弄到paint方法里面去呢?

当然方法可能有很多,这里我只介绍我所知道的:要把画出来的图形在paint方法中再次画出来,就需要有东西来保存画过的图形。保存可以使用数组或者集合,这里推荐使用集合,可以很方便的实现添加,而不需要去考虑大小的问题。数组的实现也大同小异,这里就不多做介绍。确定了使用集合,那么集合内保存什么类型的数据呢?毫无疑问应该保存的是图形的数据,但是集合使用泛型的话也只能保存同一种类型的数据,我们却有那么多种图形?这里就可以使用接口或者抽象类,我们只需要创建不同得图形类,让它继承抽象类或者是实现接口。然后每画一个图形就实例化一个图形的对象,存入集合中,最后在paint方法中遍历集合,重新绘制图形即可。

下面直接贴最终代码(仍然只写了直线和曲线),只是添加了几行代码,注意与前面比较。

//图形接口
package Cbs;
//图形集合
public interface NetJavaShape {
  public abstract void draw();
}
//直线类
package Cbs;

import java.awt.Color;
import java.awt.Graphics;
import Cbs.NetJavaShape;

public class ImpLine implements NetJavaShape{
  Graphics g;
  int x1, y1,x2, y2;
  Color c;
  public ImpLine(Graphics g,int x1,int y1,int x2,int y2,Color c){
    this.g=g;
    this.c=c;
    this.x1=x1;
    this.y1=y1;
    this.x2=x2;
    this.y2=y2;
  }
  public void draw() {
    g.setColor(c);
    g.drawLine(x1, y1, x2, y2);
  }

}
//DrawListener类
package Cbs;

import java.awt.Color;
import java.awt.Graphics;
import java.util.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import Cbs.NetJavaShape;
import javax.swing.JButton;

public class DrawListener implements ActionListener, MouseListener,
    MouseMotionListener {
  private Color color=Color.BLACK;//颜色属性,初始值为黑色
  private Graphics g;//画笔属性
  private String str;//保存按钮上的字符串,区分不同的按钮
  private int x1,y1,x2,y2;//(x1,y1),(x2,y2)分别为鼠标的按下和释放时的坐标
  private JButton nowColor;//当前颜色按钮
  //保存图形对象的集合
  private List<NetJavaShape> shapesArray = new ArrayList<NetJavaShape>();
  //图形
  private NetJavaShape shape;
  //在draw类中获取集合
  public List<NetJavaShape> getShapesArray() {
    return shapesArray;
  }
  //获取Draw类的画笔对象
  public void setG(Graphics g) {
    this.g = g;
  }
  //获取当前颜色按钮
  public void setNowColor(JButton nowColor) {
    this.nowColor = nowColor;
  }

  @Override
  //鼠标拖动的方法
  public void mouseDragged(MouseEvent e) {
    //画曲线的方法
    if ("画曲线".equals(str)) {
      int x, y;
      x = e.getX();
      y = e.getY();
      //实例化对象,曲线也是直线画的所以不同新建一个曲线类了
      shape=new ImpLine(g,x,y,x1,y1,color);
      //调用画图方法
      shape.draw();
      //将图形存入集合中
      shapesArray.add(shape);
//      g.drawLine(x, y, x1, y1);
      x1 = x;
      y1 = y;
    }
  }

  @Override
  //鼠标移动方法
  public void mouseMoved(MouseEvent e) {

  }

  @Override
  //鼠标单击方法
  public void mouseClicked(MouseEvent e) {

  }

  @Override
  //鼠标按下方法
  public void mousePressed(MouseEvent e) {

    g.setColor(color);//改变画笔的颜色

    x1=e.getX();//获取按下时鼠标的x坐标
    y1=e.getY();//获取按下时鼠标的y坐标
  }

  @Override
  //鼠标释放方法
  public void mouseReleased(MouseEvent e) {
    x2=e.getX();//获取释放时鼠标的x坐标
    y2=e.getY();//获取释放时鼠标的y坐标
    //画直线的方法
    if ("画直线".equals(str)) {
      //实例化对象,
      shape=new ImpLine(g,x1,y1,x2,y2,color);
      //调用画图方法
      shape.draw();
      //将图形存入集合中
      shapesArray.add(shape);
//      g.drawLine(x1, y1, x2, y2);
    }
  }

  @Override
  //鼠标进入方法
  public void mouseEntered(MouseEvent e) {

  }

  @Override
  //鼠标退出方法
  public void mouseExited(MouseEvent e) {

  }

  @Override
  //处理按钮上的鼠标点击动作
  public void actionPerformed(ActionEvent e) {

    if ("".equals(e.getActionCommand())) {
      JButton jb = (JButton) e.getSource();
      color = jb.getBackground();
      nowColor.setBackground(color);//处理当前颜色
    } else {
      str = e.getActionCommand();
    }
  }

}

//draw类
package Cbs;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Draw类,用于界面的初始化
 * @author CBS
 */
@SuppressWarnings("serial")
public class Draw extends JFrame {
  private DrawListener dl;
  private Graphics g;
  //保存图形对象的集合
  private List<NetJavaShape> shapesArray = new ArrayList<NetJavaShape>();
  // 界面初始化方法
  public void showUI() {
    setTitle("画图");//窗体名称
    setSize(1200, 900);//窗体大小
    setDefaultCloseOperation(3);
    setLocationRelativeTo(null);//窗体居中
    FlowLayout layout = new FlowLayout(FlowLayout.LEFT);//流式布局左对齐
    setLayout(layout);//窗体使用流式布局管理器
    this.setResizable(false);//窗体大小不变

    //使用数组保存按钮名
    String buttonName[] = { "画直线", "画椭圆", "画曲线", "多边形",   "橡皮擦", "拖动线","三角形", "画球形", "笔刷", "喷枪", "色子", "立体矩形", "立体圆", "立体三角","迭代分形", "现代分形", "枫叶", "画树", "mandelbrot集", "L-System", "迭代画线","迭代三角形", "谢尔宾斯基地毯", "画字符", "清空","吸管" ,"矩形","五角星","多线","字符"};
    JPanel jp1=new JPanel(new GridLayout(15, 2,10,10));//用于保存图形按钮,使用网格布局
    jp1.setPreferredSize(new Dimension(200, 800));

    //实例化DrawListener对象
    dl=new DrawListener();
    //循环为按钮面板添加按钮
    for (int i = 0; i < buttonName.length; i++) {
      JButton jbutton = new JButton(buttonName[i]);
      jbutton.addActionListener(dl);//为按钮添加监听
      jp1.add(jbutton);
    }

    JPanel jp2=new JPanel();//画布面板
    jp2.setPreferredSize(new Dimension(970, 800));
    jp2.setBackground(Color.WHITE);

    // 定义Color数组,用来存储按钮上要显示的颜色信息
    Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,Color.LIGHT_GRAY,Color.YELLOW};
    //用于保存颜色按钮的面板
    JPanel jp3=new JPanel(new GridLayout(1,colorArray.length,3,3));
    // 循环遍历colorArray数组,根据数组中的元素来实例化按钮对象
    for (int i = 0; i < colorArray.length; i++) {
      JButton button = new JButton();
      button.setBackground(colorArray[i]);
      button.setPreferredSize(new Dimension(30, 30));
      button.addActionListener(dl);//为按钮添加监听
      jp3.add(button);
    }
    //将面板添加到主窗体
    this.add(jp1);
    this.add(jp2);
    this.add(jp3);
    //添加按钮,作为当前颜色
    JButton nowColor=new JButton();
    nowColor.setPreferredSize(new Dimension(40,40));
    nowColor.setBackground(Color.BLACK);//默认黑色
    add(nowColor);
    //设置窗体的组件可见,如果为FALSE就看不到任何组件
    setVisible(true);
    //获取画笔对象
    g=jp2.getGraphics();
    dl.setG(g);
    dl.setNowColor(nowColor);
    //获取保存的集合
    shapesArray=dl.getShapesArray();
    //为面板添加鼠标监听,用于绘制图形
    jp2.addMouseListener(dl);
    jp2.addMouseMotionListener(dl);
  }
  @Override
  //重写paint方法
  public void paint(Graphics g) {
    //调用父类的paint方法,绘制界面上的组件
    super.paint(g);
    //foreach遍历集合
    for (NetJavaShape l : shapesArray) {
      l.draw();
    }
  }

}

这里使用集合添加图形实现画板的重绘时,我是每实现一个图形就会新建一个类来保存图形的信息,这样图形类就会有很多。如果不想创建那么多的图形类可以把它们都放到一个类里面,设置一个type的参数,赋上按钮的名称。然后在draw方法中依据这个值判断是什么图形实现不同的画图方法。这样画板的所有功能基本就实现了,画板的项目也就到这里。

总结:

画图板的制作重要用到了Swing的组件,事件监听机制,Graphics绘图和画板的重绘以及集合的使用,抽象类或者是接口作为规范图形类的作用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现gif动画效果(java显示动态图片)

    就是每隔一定的时间显示一张图片,全部图片文件位于:"工作空间\项目名称\bin\动态图\花好月圆\"文件夹下.文件名类似:1001.jpg,1002.jpg,一直到1016.jpg: 复制代码 代码如下: /* * Donttai.java * * Created on __DATE__, __TIME__ */ package 动态图; import java.awt.Graphics;import java.awt.Image;import java.awt.image.Image

  • java 2d画图示例分享(用java画图)

    Java 2D API通过扩展抽象窗口工具箱(AWT),为Java程序提供了二维图像,文本和图形的功能.这个复杂的渲染包支持线形图像,文本和图形,为富用户界面,复杂绘图程序和图像处理器开发者提供灵活的,功能强大的框架.Java 2D对象出现在一个平面中,称为用户坐标系空间,和设备坐标系空间.当对象在屏幕或打印机中渲染时,用户空间坐标系被转换成设备空间坐标系. 复制代码 代码如下: import java.awt.BasicStroke;import java.awt.Color;import j

  • JAVA GUI自定义JPanel画板背景

    自定义JPanel面板背景 一.前言 1.GUI全称是Graphical User Interface,就是图形用户界面.JAVA的GUI应用广泛在我们生活中也很常见.很多应用使用该GUI编程设计,像点击QQ图标弹出对应的登录窗体. 一般程序与用户的交互都基于对应程序的运行界面. 2.JPanel面板是SWING下的一个面板容器类.该面板支持嵌套,可设置布局方式,设置不同的布局管理器可添加其他控件像JButton按钮,JTextField文本框等.来设计完善一个程序界面窗体. 作为绘制面板支持s

  • Java画笔的简单实用方法

    Java中提供了画笔,可以使用画笔做出界面上的任何东西,接下来先熟悉一下画笔的使用过程,以画一条线为例. 源码: import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; import javax.swing.JPanel; /** * 画笔的初始用 * * @author M_WBCG * */ publi

  • Java拖曳鼠标实现画线功能的方法

    本文实例主要实现Java拖曳鼠标画线的功能,为了达到画线的功能,分别用implements MouseListener与MouseMotionListener,并且由mousePressed(),mouseReleased()取得鼠标拖曳的开始与结束坐标.这是一个掌握Java鼠标事件的很好的范例. 具体实现代码如下: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MouseDemo e

  • Java版画板的实现方法

    Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现. 基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘.(文章较长,但是代码是逐步递进的,可以按三部分分开来看,实现了当前部分再去看下一部分.)首先是画板的界面实现,因为我没有去找具体的图标,界面上的所有组件都是Swing的自带组件,所以界面略微有点简陋,不过如果想要优化也简单,把界面上的组件都改成自定义的图标即可.界面实现后,就可以考虑给界面的组件加上监听

  • Java定义画板类的方法

    在画图软件中,可以画出不同大小的圆形.矩形等几何图形.圆形都有半径,可以根据半径计算圆形的面积和周长,矩形都有宽和高,可以根据宽高来计算矩形的面积和周长. 编写Java程序: (1)分别设计实现圆形类.正方形类.长方形类,并根据文字描述合理设计类的成员属性和方法. (2)设计实现画板类,在画板类的main方法中 ①画一个圆形(即创建一个圆形对象,并给其成员属性赋值),然后调用方法获取它的面积和周长并打印: ②画一个正方形(即创建一个正方形对象,并给其成员属性赋值),然后调用方法获取它的面积和周长

  • Java版C语言版简单使用静态语言实现动态数组的方法

    动态语言相对于静态语言的一个优势,就是数组可以不需要预先确定大小,对于一些数组长度不确定的场景下是非常有用的.像PHP,只需要声明一下数组 $arr = array() 然后就可以直接 $arr[] = 1,$arr[] = 2,$arr[] = 3...这样一直加元素了,删除一个元素就直接使用unset($arr[1]),元素的空间就被释放了,而C和JAVA原生的数组就没有这么方便,声明的时候就必须先预先确定长度,由编译器分配相应的内存空间.不过通过一些巧妙的做法,也是可以实现一样的功能的,这

  • IDEA版使用Java操作Redis数据库的方法

    首先 下载 jedis.jar包 然后再 工程设置里面找到Libraries,点击+.添加下载好的jedis.jar包.点击OK退出即可 创建Java_Control_Redis类 测试链接 package ccit.redis; import redis.clients.jedis.Jedis; public class Java_Control_Redis { public static void main(String[] args) { //连接本地的 Redis 服务 Jedis je

  • java实现微信H5支付方法详解

    前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹的文档敲敲敲,所以记录下来,以供自己及后来人参考,不足之处,还请指正. 首先,我们贴出调用支付接口的H5页面,当然,在这个页面之前,还需要做很多其他的操作,我们一步一步的来. 坑爹的官方文档给了两个不同的支付接口,在微信公众平台开发中文档的"微信JS-SDK说明文档"中,给出的支付方式是下面被屏蔽的那一部分,而在商户平台的

  • java版微信公众平台消息接口应用示例

    本文实例讲述了java版微信公众平台消息接口应用方法.分享给大家供大家参考,具体如下: 微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对Java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口. 首先先把整个接口代码贴出来做下比较,然后我们再分析代码: PHP: <?php /** * wechat php test */ //define your token define("TOKEN", &

  • 自己动手写一个java版简单云相册

    动手写一个java版简单云相册,实现的功能是: 用户可以一次上传一个至多个文件. 用户可以下载其他人上传的图片. 用户可以查看其他所有人的图片. 用户只能删除通过自己IP上传的图片. 用到的技术: 文件上传下载.设计模式.Dom4j.xPath等. 先看下2个页面: 源代码: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns=

  • 详解Java中Method的Invoke方法

    在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错.虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码.  Method的invoke方法 1.先检查 AccessibleObject的override属性是否为true. Accessib

  • 微信公众平台开发实战Java版之微信获取用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称.头像.性别.所在城市.语言和关注时间. 开发者可通过OpenID来获取用户基本信息.请使用https协议. 我们可以看看官方的文档:获取用户的基本信息. 接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/cgi-b

  • K均值聚类算法的Java版实现代码示例

    1.简介 K均值聚类算法是先随机选取K个对象作为初始的聚类中心.然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心.聚类中心以及分配给它们的对象就代表一个聚类.一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算.这个过程将不断重复直到满足某个终止条件.终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小. 2.什么是聚类 聚类是一个将数据集中在某些方面相似的数据成员进行分类组织

随机推荐