Control de árbol de Java
Paquete ui;
importar javax.swing.*;
importar Java.awt.*;
importar Java. awt.event.*;
importar Java.util.vector ;
La clase pública TreePanel extiende JPanel {
Vector privado <TreePanelNode>Node;
Vector privado <Integer>Nodo seleccionado;
p>
private int tmpX, tmpY
nodo de edición int privado =-1
int privado agregando padre =; -2;
privado int mouseX , mouseY
Público TreePanel () {
nodos = nuevo Vector & ltTreePanelNode & gt(); p>selectedNodes = nuevo Vector & ltInteger & gt() ;
setBackground(color.white);
addMouseListener(new MouseAdapter() {
public void mouse presionado (evento del mouse yo){
tmpX = me . getx();
tmpY = me gety();
if (nodes.size. () == 0) {
agregando padre =-1;
}
int I = 0;
for(; i<nodes.size();i++) {
if (nodes.get(i).getBounds().contains(mouseX,mouseY)) {
if (me.isControlDown( )) {
if (!selectedNodes.contains(i))
nodos seleccionados .add(I)
Otro
; nodos seleccionados .eliminar elemento(I);
} else if(! selectedNodes.contains(i)) {
selectedNodes = new Vector & ltinteger& gt();
nodos seleccionados add(I);
}
if (me.getClickCount() == 2) {
nodos.get(i).
setValue(" ");
nodo de edición = I;
}
Romper;
}
}
if (i == nodes.size())
if (!me.isControlDown())
selectedNodes = new Vector & ltInteger& gt( );
repintar();
}
mouse vacío público liberado (evento del mouse yo){
agregando padre = -2 ;
}
});
addMouseMotionListener(new MouseMotionAdapter() {
ratón vacío público arrastrado (evento del mouse yo){
mouseX = yo . getx();
mouseY = yo . (i<nodos seleccionados. tamaño(); i++) {
if(nodos. get(nodos seleccionados. get(I)).getBounds().contains(mouseX,mouseY))
Break;
}
if (yo ! = selectedNodes.size()) {
if(yo . isaltdown() & amp;& ampadding padre ! = -3) {
agregando padre = nodos seleccionados get(I);
}else {
for( I = 0;i<nodos seleccionados. size();i++) {
nodos.get(selectedNodes.get(i)). establecer ubicación(nodos .get(nodos seleccionados .get(I)). getLocation(). x + mouseX - tmpX,
nodes.get(selectedNodes.get()); /p>
tmpX = ratónX
tmpY = ratónY
}
}
repintar();
}
mouse del mouse vacío público (evento del mouse yo){
mouseX = yo . getx();
mouseY = yo . gety() ;
}
});
addkey oyente(nuevo adaptador de clave(){
clave pública vacía escrita (evento clave ke){
if (editingNode! = -1) {
if (ke.getKeyCode() == KeyEvent.VK_Enter)
nodo de edición =-1;
Otros
nodes.get (editar nodos). setValue(nodes.get(editingNode).getValue().
toString()+ke . getkey char());
} else if(ke . get key code()= = key event.VK_delete){
for(int I = 0; i & ltnodos seleccionados. tamaño(); i++)
nodos. eliminar(nodos seleccionados. get(I)); );
}
});
}
Pintura pública en blanco (gráfico g) {
super.paint(gram);
font metrics FM = g.getfont metrics();
if(agregar padre & gt;-2) {
string str = "nodo"+nodos .
int ancho = FM .
int altura = FM . >
TreePanelNode pnt = null
if (addingParent!= -1)
pnt = nodos get(agregando padre);
nodos .add. (nuevo TreePanelNode(pnt, mouseX-width/2-10, mouseY-height/2-20, width+20, height+40, str));
agregando padre =-3;
selectedNodes = new Vector & ltinteger& gt();
nodos seleccionados . add(nodes . size()-1);
}
for(int I = 0; i & ltnodes . size(); i++) {
String str = nodes.get(i). obtenerValor(). toString();
int ancho = FM. ancho de cadena(str);
int alto = FM getheight();
nodes.get(i. ). setSize(ancho + 20, alto + 40);
if (selectedNodes.contains(i))
g.setColor(color.red);
Otros
g.setColor(color.black);
if (nodes.get(i).getParent()!=null)
g.drawLine (nodos.get(i)). obtenerUbicación(). x+nodos.get(i). getWidth()/2,
nodos.get(i). obtenerUbicación(). y+nodos.get(i). getHeight()/2,
nodos.get(i). getParent(). obtenerUbicación(). x+nodos.get(i). getParent(). getWidth()/2,
nodos.get(i). getParent(). obtenerUbicación(). y+nodos.get(i). getParent().
getHeight()/2);
g.drawString(str, nodes.get(i)). obtenerUbicación(). x + 10, nodos.get(i). obtenerUbicación(). y+20);
g.drawRect(nodes.get(i)). obtenerUbicación(). x,nodos.get(i). obtenerUbicación(). y,nodos.get(i). getWidth(), nodos.get(i). getHeight());
}
agarrar foco();
}
}