?? linebean.java
字號:
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) { labelPressX=e.getX(); labelPressY=e.getY(); } 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(); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -