?? jtpdesktoppane.java
字號:
package com.sunking.tp.swing;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
//import java.awt.geom.*;
import java.util.*;
import com.sunking.tp.tool.*;
import com.sunking.tp.framework.*;
/**
*
* <p>Title: </p>
* <p>Description: 畫圖桌面</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
* @version 1.0
*/
public class JTPDesktopPane extends JPanel implements Desktop, java.io.Serializable {
private static final long serialVersionUID = -3000000000000000009L;
/**
*
*/
// BasicStroke stroke=new BasicStroke(1.0f,BasicStroke.CAP_BUTT,
// BasicStroke.JOIN_ROUND,140.0f,new float[]{1.0f},150.0f);
/**
*拖動框
*/
Rectangle dragRec = null;
/**
*當前選取的連線
*/
AssoicatorLine selectedLine = null;
/**
*所有連線
*/
AssoicatorLine assoicatorLines[] = null;
/**
*最大尺寸
*/
Dimension maxSize = new Dimension(0, 0);
/**
*當前工具
*/
Tool tool;
/**
*默認工具
*/
transient Tool defaultTool;
/**
*右鍵彈出菜單生成器
*/
transient JTPMenuFactory jtpMenuFactory;
public JTPDesktopPane() {
this.setLayout(null);
setTool(getDefaultTool());
setBackground(UIManager.getColor("Desktop.background"));
}
/**
*添加鼠標監聽器
* @param l
*/
public void addMouseInputListener(MouseInputListener l) {
this.addMouseListener(l);
this.addMouseMotionListener(l);
}
/**
*移除鼠標監聽器
* @param l
*/
public void removeMouseInputListener(MouseInputListener l) {
this.removeMouseListener(l);
this.removeMouseMotionListener(l);
}
/**
*取得某點上的組件
* @param p
* @return
*/
public JTPComponent getJTPComponent(Point p) {
for (int i = 0; i < getComponentCount(); i++) {
Component c = getComponent(i);
Point p1 = SwingUtilities.convertPoint(this, p, c);
if ( (c instanceof JTPComponent) && c.contains(p1)) {
return (JTPComponent) c;
}
}
return null;
}
/**
*取得當前選取的組件
* @return
*/
public JTPComponent[] getSelectionJTPComponent() {
Vector vSelection = new Vector();
for (int i = 0; i < getComponentCount(); i++) {
Component c = getComponent(i);
if (c instanceof JTPComponent) {
JTPComponent tc = (JTPComponent) c;
if (tc.isSelected()) {
vSelection.add(tc);
}
}
}
JTPComponent tpc[] = new JTPComponent[vSelection.size()];
vSelection.copyInto(tpc);
return tpc;
}
/**
*添加選取的組件
* @param c
*/
public void addSelection(JTPComponent c) {
c.setSelect(true);
}
/**
*移除選取的組件
* @param c
*/
public void removeSelection(JTPComponent c) {
c.setSelect(false);
}
/**
*設置工具
* @param t
*/
public void setTool(Tool t) {
getDefaultTool().disabledTool();
if (tool != null) {
tool.disabledTool();
}
this.tool = t;
if (t != null) {
t.enabledTool();
} else {
getDefaultTool().enabledTool();
}
repaint();
}
/**
*取得當前工具
* @return
*/
public Tool getTool() {
if (tool != null) {
return tool;
}
return getDefaultTool();
}
/**
*取得默認工具
* @return
*/
public Tool getDefaultTool() {
if (defaultTool == null) {
defaultTool = new SelectionTool(this);
}
return defaultTool;
}
/**
*激發連接器更新
*/
public void fireAssoicatorChanged() {
assoicatorLines = getAssoicatorLines();
this.setPreferredSize(maxSize);
repaint();
if (getParent() != null) {
getParent().doLayout();
}
}
/**
*鼠標點擊選取
* @param p
*/
public void mouseSelect(Point p) {
selectedLine = null;
JTPComponent tp = getJTPComponent(p);
if (tp != null) {
tp.setSelect(true);
} else {
if (assoicatorLines != null && p != null) {
for (int i = 0; i < assoicatorLines.length; i++) {
if (assoicatorLines[i].contains(p)) {
selectedLine = assoicatorLines[i];
}
}
}
}
repaint();
}
/**
*鼠標拉框選取
* @param rec
*/
public void mouseSelect(Rectangle rec) {
dragRec = rec;
if (dragRec == null) {
repaint();
return;
}
for (int i = 0; i < getComponentCount(); i++) {
Component c = getComponent(i);
if (c instanceof JTPComponent) {
if (c.getBounds().intersects(rec)) {
( (JTPComponent) c).setSelect(true);
selectedLine = null;
} else {
( (JTPComponent) c).setSelect(false);
}
}
}
repaint();
}
/**
*清除全部選取
*/
public void clearSelection() {
for (int i = 0; i < getComponentCount(); i++) {
if (getComponent(i)instanceof JTPComponent) {
JTPComponent c = (JTPComponent) getComponent(i);
c.setSelect(false);
}
}
selectedLine = null;
repaint();
}
/**
*刪除當前選取
*/
public void deleteSelection() {
if (selectedLine != null) {
selectedLine.source.removeAssociator(selectedLine.dest);
selectedLine.dest.removeAssociator(selectedLine.source);
selectedLine = null;
} else {
for (int i = getComponentCount() - 1; i >= 0; i--) {
if (getComponent(i)instanceof JTPComponent) {
JTPComponent c = (JTPComponent) getComponent(i);
if (c.isSelected()) {
remove(c);
remove(i);
//break;
}
}
}
}
fireAssoicatorChanged();
}
/**
* 取得當前選取的連線
* @return
*/
public AssoicatorLine getSelectionLine(){
return selectedLine;
}
/**
*移除組件
* @param c
*/
public void remove(JTPComponent c) {
if (assoicatorLines != null) {
for (int i = 0; i < assoicatorLines.length; i++) {
AssoicatorLine line = assoicatorLines[i];
if (line.source == c || line.dest == c) {
line.source.removeAssociator(line.dest);
line.dest.removeAssociator(line.source);
}
}
}
}
/**
*繪制組件及其選取狀態\拉框選取時的框線
* @param g
*/
public void paintChildren(Graphics g) {
if (assoicatorLines != null) {
for (int i = 0; i < assoicatorLines.length; i++) {
assoicatorLines[i].drawLine(g);
}
}
if (selectedLine != null) {
selectedLine.drawHandle(g);
}
super.paintChildren(g);
// Graphics2D g2=(Graphics2D)g;
// g2.setStroke(stroke);
// g2.setXORMode(getParent().getBackground());
if (dragRec != null) {
Color c = getBackground();
g.setColor(new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getBlue()));
g.drawRect(dragRec.x, dragRec.y, dragRec.width, dragRec.height);
}
}
/**
*取得當前所有的連線
* @return
*/
public AssoicatorLine[] getAssoicatorLines() {
maxSize = new Dimension(0, 0);
Vector vec = new Vector();
for (int i = 0; i < getComponentCount(); i++) {
Component com = getComponent(i);
if (com instanceof JTPComponent) {
JTPComponent c = (JTPComponent) getComponent(i);
Assoicator ass[] = c.getAssociator();
if (ass != null) {
for (int j = 0; j < ass.length; j++) {
vec.add(new AssoicatorLine(c, ass[j]));
}
}
}
maxSize.setSize(Math.max(maxSize.getWidth(), com.getX() + com.getWidth() + 10),
Math.max(maxSize.getHeight(), com.getY() + com.getHeight() + 10));
}
if (vec.size() == 0)
return null;
AssoicatorLine lines[] = new AssoicatorLine[vec.size()];
vec.copyInto(lines);
return lines;
}
/**
*設置右鍵菜單生成器
* @param f
*/
public void setJTPMenuFactory(JTPMenuFactory f) {
jtpMenuFactory = f;
}
/**
*取得右鍵菜單生成器
* @return
*/
public JTPMenuFactory getJTPMenuFactory() {
if (jtpMenuFactory == null) {
jtpMenuFactory = JTPDefaultMenuFactory.getDefault();
}
return jtpMenuFactory;
}
/**
* 調入畫圖桌面
* @param desk
*/
public void loadDesktop(Object d) throws Exception{
this.removeAll();
JTPDesktopPane desk = (JTPDesktopPane)d;
Vector v = new Vector();
for (int i = 0; i < desk.getComponentCount(); i++) {
Component c = desk.getComponent(i);
// add(c);
//這里有一個BUG,當不用Vector先存儲時,直接進行add(c),會出現丟失組件的錯誤
//不知道是什么原因.它也不會報錯.
v.add(c);
}
for (int i = 0; i < v.size(); i++) {
add((Component)v.get(i));
}
this.dragRec = desk.dragRec;
this.selectedLine = desk.selectedLine;
this.assoicatorLines = desk.assoicatorLines;
this.maxSize = desk.maxSize;
fireAssoicatorChanged();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -