📄 linebean.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 + -