⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linebean.java~335~

📁 flowGUI简单的java图形设计
💻 JAVA~335~
字号:
package com.wiziflow.gui;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.beans.*;/** * 画线控件。给定起点和终点,画一条直线。 * 只有当鼠标移出控件时,才开始画线。 * 如果整个JComponent加监听,则太大;加一个小小的JLabel,增加监听机制, * 很好的解决了line的监听问题 * */public class LineBean extends JComponent {  private Bean startBean = null;//线起点的Bean,跟前面的startBean不同  private Bean endBean = null;//线终点的Bean,跟前面的endBean不同  //如果还没有endBean,画线依据终点  private int newX=0;  private int newY=0;  private Stroke stroke = new BasicStroke(1f);  private JLabel label = new JLabel("流");  private boolean labelDragging=false;//是否在拖拉  private int labelPressX=0;//鼠标点击在label上的X坐标  private int labelPressY=0;//鼠标点击在label上的Y坐标  public LineBean() {    jbInit();    //只有设置了尺寸,才能刷新,调用paint(Graphics g)方法    //this.setSize(1000,1000);    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();    this.setSize(d);    //以后屏幕能滚动时,仅仅屏幕大小仍然不够。  }  //设置起点控件  public void setStartComponent(Bean b) {    startBean = b;  }  //设置终点控件  public void setEndComponent(Bean b) {    endBean = b;  }  public void remove() {    JLayeredPane flowPane = (JLayeredPane)getParent();    flowPane.remove(this);    flowPane.repaint();  }  private void jbInit()  {    label.setSize(20,20);    label.setFont(new Font("宋体",0,14));    //label.setBorder(BorderFactory.createLineBorder(Color.red));    label.setVisible(false);    //居中处理    label.setHorizontalAlignment(JLabel.CENTER);    label.setVerticalAlignment(JLabel.CENTER);    //流字加鼠标监听    label.addMouseListener(new java.awt.event.MouseAdapter() {      public void mouseClicked(MouseEvent e) {        label_mouseClicked(e);      }      public void mousePressed(MouseEvent e) {        label_mousePressed(e);      }      public void mouseReleased(MouseEvent e) {        labelDragging=false;      }    });    this.addPropertyChangeListener(new java.beans.PropertyChangeListener() {      public void propertyChange(PropertyChangeEvent e) {        this_propertyChange(e);      }    });    label.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {      public void mouseDragged(MouseEvent e) {        label_mouseDragged(e);      }    });    this.add(label);    //this.setBorder(BorderFactory.createLineBorder(Color.black));  }  void this_propertyChange(PropertyChangeEvent e) {    //新的坐标点    String name = e.getPropertyName();    if("x".equals(name)) {      newX = Integer.parseInt(e.getNewValue().toString());      newY = Integer.parseInt(e.getOldValue().toString());      //这一段将来还是要的//      if(endBean==null) {//        this.setSize(newX,newY);//      }else{//        this.setSize(Math.abs(endBean.getX()-startBean.getX())*2,Math.abs(endBean.getY()-startBean.getY())*2);//      }    }    this.repaint();  }  public void paint(Graphics g) {    Graphics2D g2 = (Graphics2D)g;//    //想办法让线段光滑//    RenderingHints hints = new RenderingHints(//              RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);//    hints.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);//    hints.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);//    //---------------//    g2.setRenderingHints(hints);//    g2.setStroke(stroke);    g2.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND));    if(endBean!=null) {      newX = endBean.getX()-startBean.getX();      newY = endBean.getY()-startBean.getY();    }//    this.setLocation(startBean.getX(),startBean.getY());//    this.setSize(newX-startBean.getX() ,newY-startBean.getY());    if(startBean!=null && newX!=0) {      Point [] p = null;      if(endBean==null) {//图标和鼠标之间        Point mousePoint = new Point(startBean.getX()+newX,startBean.getY()+newY);        p = Tools.getClosestPoint(startBean,mousePoint);      }else{//图标和图标之间        p = Tools.getClosestPoint(startBean,endBean);      }      //开始画线和“流”字      if(p!=null) {        //线段中点的坐标        int lineCenterX = p[0].x+(p[1].x-p[0].x)/2;        int lineCenterY = p[0].y+(p[1].y-p[0].y)/2;        Point labelPoint= new Point(lineCenterX,lineCenterY);        //label.setLocation(/2,startBean.getY()+newY/2);        if(!labelDragging) {        label.setLocation(labelPoint);        label.setVisible(true);        }        ////画线。先画开始图标到“流”字,然后从“流”字到结束图标        //g2.drawLine((int)p[0].getX(),(int)p[0].getY(),(int)p[1].getX(),(int)p[1].getY());        Point [] one = Tools.getClosestPoint(label,p[0]);        g2.drawLine(one[0].x,one[0].y,one[1].x,one[1].y);        Point [] two = Tools.getClosestPoint(label,p[1]);        g2.drawLine(two[0].x,two[0].y,two[1].x,two[1].y);      }    }    super.paint(g);  }  void label_mouseClicked(MouseEvent e) {    JLayeredPane flowPane = (JLayeredPane)getParent();    flowPane.moveToFront(label);    label.requestFocus();    System.out.println("流label click");  }  void label_mouseDragged(MouseEvent e) {    labelDragging=true;    label.setLocation(label.getX()+(e.getX()-labelPressX),label.getY()+(e.getY()-labelPressY));    this.repaint();  }  void label_mousePressed(MouseEvent e) {   labelPressX=e.getX();   labelPressY=e.getY();  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -