📄 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{
/**
*
*/
// 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;
/**
*默认工具
*/
Tool defaultTool ;
/**
*右键弹出菜单生成器
*/
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();
}
/**
*移除组件
* @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
*/
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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -