java的樹
❶ java畫樹
畫什麼都行,這個你得自己實現。我可以給你寫一個畫樹的小程序:
---------------------------------------------------------
//TreeNode.java
package util;
import java.util.Vector;
public class TreeNode {
private Vector<TreeNode> children;
private TreeNode parent;
private TreeNode root;
public TreeNode (TreeNode parent) {
children = new Vector<TreeNode>();
if (parent == null)
root = this;
else {
parent.addChild(this);
}
}
public void addChild (TreeNode n) {
addChild(children.size(), n);
}
public void addChild (int index, TreeNode n) {
children.add(index, n);
n.parent = this;
}
public void removeChild (TreeNode n) {
children.remove(n);
}
public void removeChild (int index) {
children.remove(index);
}
public void setChild (int index, TreeNode n) {
children.set(index, n);
n.parent = this;
}
public TreeNode getChild (int index) {
return children.get(index);
}
public void changePosition (int index1, int index2) {
if (0 <= index1 && index1 < children.size() &&
0 <= index2 && index2 <= children.size()) {
TreeNode tmp = children.get(index1);
children.set(index1, children.get(index2));
children.set(index2, tmp);
}
}
public void setParent (TreeNode n) {
parent = n;
}
public TreeNode getRoot () {
return root;
}
public TreeNode getParent () {
return parent;
}
public Vector<TreeNode> getChildren () {
return children;
}
}
------------------------------------------------------------
//TreePanelNode.java
package ui;
import util.TreeNode;
import java.awt.*;
public class TreePanelNode extends TreeNode {
private int x, y, width, height;
private Object value;
private TreePanelNode parent;
public TreePanelNode (TreePanelNode parent, int x, int y, int width, int height, Object value) {
super(parent);
this.x = x;
this.y = y;
this.parent = parent;
this.width = width;
this.height = height;
this.value = value;
}
public void setLocation (int x, int y) {
this.x = x;
this.y = y;
}
public void setSize (int width, int height) {
this.width = width;
this.height = height;
}
public Rectangle getBounds () {
return new Rectangle(x, y, width, height);
}
public Object getValue () {
return value;
}
public Point getLocation () {
return new Point(x, y);
}
public int getWidth () {
return width;
}
public int getHeight () {
return height;
}
public void setValue (Object value) {
this.value = value;
}
public TreePanelNode getParent () {
return parent;
}
}
--------------------------------------------------------------
//TreePanel.java
package ui;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
public class TreePanel extends JPanel {
private Vector<TreePanelNode> nodes;
private Vector<Integer> selectedNodes;
private int tmpX, tmpY;
private int editingNode = -1;
private int addingParent = -2;
private int mouseX, mouseY;
public TreePanel () {
nodes = new Vector<TreePanelNode>();
selectedNodes = new Vector<Integer>();
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<nodes.size(); 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<Integer>();
selectedNodes.add(i);
}
if (me.getClickCount() == 2) {
nodes.get(i).setValue("");
editingNode = i;
}
break;
}
}
if (i == nodes.size())
if (!me.isControlDown())
selectedNodes = new Vector<Integer>();
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<selectedNodes.size(); 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<selectedNodes.size(); 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());
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<Integer>();
selectedNodes.add(nodes.size()-1);
}
for (int i=0; i<nodes.size(); 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();
}
}
----------------------------------------------------------
//MainView.java
package ui;
import javax.swing.*;
public class MainView extends JFrame {
private TreePanel tp;
public MainView () {
super("TreeDemo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
tp = new TreePanel();
add(tp);
setVisible(true);
}
public static void main (String args[]) {
new MainView();
}
}
------------------------------------------------------------
好了。然後你新建一個 util 文件夾 和 一個 ui 文件夾,把第一個文件放在 util 文件夾下,把其餘文件放在 ui 文件夾下,文件名都根據我的注釋就行了。
例如你這兩個文件夾新建在 D 盤下,在命令行中編譯運行:
----------------------------------------------------------
...>D:
D:\>javac util\TreeNode.java ui\TreePanelNode.java ui\TreePanel.java ui\MainView.java
D:\>java ui.MainView
----------------------------------------------------------
於是便能看到效果。祝您好運,順便我寫了這么多就給個最佳答案吧,哈哈。
忘了告訴你,按住 Alt 鍵拖動 Node 可以添加子節點。
按住 Ctrl 鍵單擊 node 可以多選。
雙擊一個 node 然後可以從鍵盤輸入 新的字元串,按回車結束。
----------------------------------------------------------
如果對以上的程序還有什麼問題,留下郵箱,我直接發給你。
❷ java中的樹
swing里有JTree啊,好多實現類
web版本里也有很多現成的js 如 dtree
❸ 樹在java中的應用有哪些
首先:樹與線性表、棧、隊列等線性結構不同,樹是一種非線性結構。一棵樹只有一個根節點,如果一棵樹有了多個根節點,那它已經不再是一棵樹了,而是多棵樹的集合,也被稱為森林。
其次:java中樹的應用主要有:菜單樹,還有許可權樹,商品分類列表也是樹結構。
❹ 關於java樹結構的實現
可以用遞歸模擬樹
要求子樹擁有父樹的id;
絕對原創;
import java.util.ArrayList;
import java.util.List;
public class Test2 {
public static void main(String[]args){
List<Tree> trees = new ArrayList<Tree>();
int id = 1;
Tree t1 = new Tree(0,id++,"我是根樹");
Tree t2 = new Tree(0,id++,"我是第二個根樹");
Tree t3 = new Tree(1,id++,"我是子樹");
trees.add(t1);
trees.add(t2);
trees.add(t3);
Tree t4 = new Tree(1,id++,"樹根你好");
Tree t5 = new Tree(4,id++,"我不是樹根");
Tree t6 = new Tree(5,id++,"我才是樹根");
trees.add(t4);
trees.add(t5);
trees.add(t6);
show(trees);
}
public static void show(List<Tree> trees){
for(int i=0;i<trees.size();i++){
Tree t = trees.get(i);
if(t.parent == 0){
StringBuffer blank = new StringBuffer();
t.show(trees,blank);
}
}
}
}
import java.util.List;
public class Tree {
public Tree(int parent,int id,String str) {
this.parent = parent;
this.id = id;
this.str = str;
}
int parent;//樹的根樹
int id;
String str;
// StringBuffer blank = new StringBuffer();
void show(List<Tree> trees, StringBuffer blank){
blank.append(" ");
System.out.println(blank + str );
for(int i=0;i<trees.size();i++){
Tree t = trees.get(i);
if(t.parent == id){
t.show(trees,blank);
}
}
}
}
❺ java 如何實現樹、圖結構
他們的實現是底層程序員早都寫好了的,他們的原理確實是樹、圖結構。
❻ java樹結構
請問java中有沒有實現Tree型結構的類(如鏈表在java中可以用List實現),是可以用遞歸模擬樹要求子樹擁有父樹的id; 絕對原創; import java.util.Array
❼ java對象樹是什麼東東
給你這么講吧:就相當於一個大家庭一樣,首先是祖父母,外祖父母,然後是線面的父母,叔叔,阿姨等,再然後是表哥,表姐,堂兄堂弟等,再然後是下面的子子孫孫.等等.就如同一顆倒置的大樹,根在上邊,枝葉在下邊一樣,有若干分支.但不是無窮無盡的.能明白嗎?
❽ 如何用Java實現樹形結構啊
定義一個簡單的菜單類 這里是簡單的示例 你可以自行擴展package entity;import java.util.ArrayList;
import java.util.List;/**
* 菜單類
* @author Administrator
*
*/
public class Menu {
/**
* 菜單標題
*/
private String title;
/**
* 子菜單的集合
*/
private List<Menu> childs;
/**
* 父菜單
*/
private Menu parent;
/**
* 構造函數 初始化標題和子菜單集合
*/
public Menu(String title) {
this();
this.title=title;
}
/**
* 構造函數 創建一個虛擬的父菜單(零級菜單) 所有的一級菜單都歸屬於一個虛擬的零級菜單
*
*/
public Menu() {
this.childs = new ArrayList<Menu>();
}
/**
* 獲取子菜單
* @return
*/
public List<Menu> getChilds() {
return childs;
}
/**
* 獲取標題
* @return
*/
public String getTitle() {
return title;
}
/**
* 獲取父菜單
* @return
*/
public Menu getParent() {
return parent;
}
/**
* 添加子菜單並返回該子菜單對象
* @param child
* @return
*/
public Menu addChild(Menu child){
this.childs.add(child);
return child;
}
/**
* 設置父菜單
* @param parent
*/
public void setParent(Menu parent) {
this.parent = parent;
}
/**
* 設置標題
* @param title
*/
public void setTitle(String title) {
this.title = title;
}
} 測試package entity;
/**
* 測試類
* @author Administrator
*
*/
public class Test { /**
* @param args
*/
public static void main(String[] args) {
/**
* 創建一個虛擬的父菜單 用於存放一級菜單 menu01 和 menu02
*/
Menu root = new Menu();
/**
* 創建兩個一級菜單
*/
Menu menu01 = new Menu("一級菜單01");
Menu menu02 = new Menu("一級菜單02");
/**
* 加入虛擬菜單
*/
root.addChild(menu01);
root.addChild(menu02);
/**
* 為兩個一級菜單分別添加兩個子菜單 並返回該子菜單 需要進一步處理的時候 才接收返回的對象 否則只要調用方法
*/
Menu menu0101 = menu01.addChild(new Menu("二級菜單0101"));
menu01.addChild(new Menu("二級菜單0102"));
menu02.addChild(new Menu("二級菜單0201"));
Menu menu0202 = menu02.addChild(new Menu("二級菜單0202"));
/**
* 添加三級菜單
*/
menu0101.addChild(new Menu("三級菜單010101"));
menu0202.addChild(new Menu("三級菜單020201"));
/**
* 列印樹形結構
*/
showMenu(root);
} /**
* 遞歸遍歷某個菜單下的菜單樹
*
* @param menu
* 根菜單
*/
private static void showMenu(Menu menu) {
for (Menu child : menu.getChilds()) {
showMenu(child, 0);
}
} private static void showMenu(Menu menu, int tabNum) {
for (int i = 0; i < tabNum; i++)
System.out.print("\t");
System.out.println(menu.getTitle());
for (Menu child : menu.getChilds())
// 遞歸調用
showMenu(child, tabNum + 1);
}}
控制台輸出結果 一級菜單01 二級菜單0101
三級菜單010101
二級菜單0102一級菜單02
二級菜單0201
二級菜單0202
三級菜單020201
❾ java中如何建立一個java樹,請詳解
importjava.awt.*;
importjavax.swing.*;
classTreeDemoextendsJFrame
{
publicTreeDemo()
{
setSize(400,300);
setTitle("演示怎樣使用JTree");
show();
JScrollPanejPanel=newJScrollPane();
getContentPane().add(jPanel);
JTreejtree=newJTree();
jPanel.getViewport().add(jtree,null);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
publicclassExample5_25
{
publicstaticvoidmain(String[]args)
{
TreeDemoframe=newTreeDemo();
}
}
其中JScrollPane是一個帶滾動條的面板類。
將對象加入到帶滾動條的面板類中,在將已建的數放入到其中。
就可建立一個系統默認的樹結構。
❿ Java中有沒有現成的樹形結構的類
樹時用來存儲東西的,如果非要說類似的類,那麼應該是treemap和treeset應該是使用的avl平衡二叉樹實現的。其他的,好像暫時沒有發現。正常演算法使用的樹,都是用的node裡面存放引用來實現的。