java树控件_java树形控件

这篇博客展示了如何使用Java Swing创建一个树形控件。通过一个名为`TreePanel`的类,实现了对节点的添加、删除、拖动以及双击编辑等功能。示例代码中详细定义了`TreePanel`类的结构和事件处理,包括鼠标和键盘事件监听,以实现对树形结构的交互操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

展开全部

我写过,你要的话可以发给你,可以后台联系,为了符合回答规范,还是把代码贴出来(鉴于62616964757a686964616fe59b9ee7ad9431333262363666篇幅仅帖一个文件):

package ui;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.Vector;

public class TreePanel extends JPanel {

private Vector nodes;

private Vector selectedNodes;

private int tmpX, tmpY;

private int editingNode = -1;

private int addingParent = -2;

private int mouseX, mouseY;

public TreePanel () {

nodes = new Vector();

selectedNodes = new Vector();

setBackground(Color.WHITE);

addMouseListener(new MouseAdapter() {

public void mousePressed (MouseEvent me) {

tmpX = me.getX();

tmpY = me.getY();

if (nodes.size() == 0) {

addingParent = -1;

}

int i = 0;

for (; i

if (nodes.get(i).getBounds().contains(mouseX, mouseY)) {

if (me.isControlDown()) {

if (!selectedNodes.contains(i))

selectedNodes.add(i);

else

selectedNodes.removeElement(i);

} else if (!selectedNodes.contains(i)) {

selectedNodes = new Vector();

selectedNodes.add(i);

}

if (me.getClickCount() == 2) {

nodes.get(i).setValue("");

editingNode = i;

}

break;

}

}

if (i == nodes.size())

if (!me.isControlDown())

selectedNodes = new Vector();

repaint();

}

public void mouseReleased (MouseEvent me) {

addingParent = -2;

}

});

addMouseMotionListener(new MouseMotionAdapter() {

public void mouseDragged (MouseEvent me) {

mouseX = me.getX();

mouseY = me.getY();

int i = 0;

for (; i

if (nodes.get(selectedNodes.get(i)).getBounds().contains(mouseX, mouseY))

break;

}

if (i != selectedNodes.size()) {

if (me.isAltDown() && addingParent != -3) {

addingParent = selectedNodes.get(i);

} else {

for (i=0; i

nodes.get(selectedNodes.get(i)).setLocation(nodes.get(selectedNodes.get(i)).getLocation().x + mouseX - tmpX,

nodes.get(selectedNodes.get(i)).getLocation().y + mouseY - tmpY);

}

tmpX = mouseX;

tmpY = mouseY;

}

}

repaint();

}

public void mouseMoved (MouseEvent me) {

mouseX = me.getX();

mouseY = me.getY();

}

});

addKeyListener(new KeyAdapter() {

public void keyTyped (KeyEvent ke) {

if (editingNode != -1) {

if (ke.getKeyCode() == KeyEvent.VK_ENTER)

editingNode = -1;

else

nodes.get(editingNode).setValue(nodes.get(editingNode).getValue().toString()+ke.getKeyChar());

} else if (ke.getKeyCode() == KeyEvent.VK_DELETE) {

for (int i=0; i

nodes.remove(selectedNodes.get(i));

}

repaint();

}

});

}

public void paint (Graphics g) {

super.paint(g);

FontMetrics fm = g.getFontMetrics();

if (addingParent > -2) {

String str = "node" + nodes.size();

int width = fm.stringWidth(str);

int height = fm.getHeight();

TreePanelNode pnt = null;

if (addingParent != -1)

pnt = nodes.get(addingParent);

nodes.add(new TreePanelNode(pnt, mouseX-width/2-10, mouseY-height/2-20, width+20, height+40, str));

addingParent = -3;

selectedNodes = new Vector();

selectedNodes.add(nodes.size()-1);

}

for (int i=0; i

String str = nodes.get(i).getValue().toString();

int width = fm.stringWidth(str);

int height = fm.getHeight();

nodes.get(i).setSize(width + 20, height + 40);

if (selectedNodes.contains(i))

g.setColor(Color.RED);

else

g.setColor(Color.BLACK);

if (nodes.get(i).getParent() != null)

g.drawLine(nodes.get(i).getLocation().x+nodes.get(i).getWidth()/2,

nodes.get(i).getLocation().y+nodes.get(i).getHeight()/2,

nodes.get(i).getParent().getLocation().x+nodes.get(i).getParent().getWidth()/2,

nodes.get(i).getParent().getLocation().y+nodes.get(i).getParent().getHeight()/2);

g.drawString(str, nodes.get(i).getLocation().x + 10, nodes.get(i).getLocation().y + 20);

g.drawRect(nodes.get(i).getLocation().x, nodes.get(i).getLocation().y, nodes.get(i).getWidth(), nodes.get(i).getHeight());

}

grabFocus();

}

}

本回答由提问者推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值