1. 程式人生 > >JTree(右鍵選單,可拖拽)+JTable(可翻頁,列中含有按鈕,隱藏列)

JTree(右鍵選單,可拖拽)+JTable(可翻頁,列中含有按鈕,隱藏列)

首先來看一下展示介面,JTree的特點有:節點可拖拽,根據輸入生成目錄,右鍵有選單,點選觸發事件等

 JTable的特點有:含有隱藏列,可以進行翻頁,列中含有下載按鈕等

在來看一下程式碼吧,基本程式碼由Eclipse上的WindowBuilder進行拖拽式產生的,所以看起來有點亂,不過沒事

在使用WindowBuilder的時候要畫JTree和JTable時要注意,這兩個有幾個共同點,必須放到JScrollPanel中,因為這兩個控制元件的內容長度會發生突然變化,所以要使用JScrollPanel。

package test;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.border.EmptyBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.tree.DefaultMutableTreeNode;


public class InnerDocsMgt extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private JTable table;
	private JTree tree;
	private JLabel currentDirLabel;
	private JLabel totalFilesNumLabel;
	private List<VEachFile> docFils;
	private final int maxFilesAPage = 50;
	private JLabel curPageLabel;
	private int curPageNum = 0;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					InnerDocsMgt frame = new InnerDocsMgt();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public InnerDocsMgt() {
		setTitle("\u5185\u90E8\u8D44\u6599\u7BA1\u7406");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		this.setSize(800, 600);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);

		JPanel panel = new JPanel();
		contentPane.add(panel, BorderLayout.WEST);
		GridBagLayout gbl_panel = new GridBagLayout();
		gbl_panel.columnWidths = new int[] { 54, 0, 0, 0, 0, 0, 0, 0 };
		gbl_panel.rowHeights = new int[] { 31, 0, 0 };
		gbl_panel.columnWeights = new double[] { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
				0.0, Double.MIN_VALUE };
		gbl_panel.rowWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
		panel.setLayout(gbl_panel);

		JLabel lblNewLabel = new JLabel(
				"\u5185\u90E8\u8D44\u6599\u76EE\u5F55\u5217\u8868");
		GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
		gbc_lblNewLabel.gridwidth = 5;
		gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel.gridx = 0;
		gbc_lblNewLabel.gridy = 0;
		panel.add(lblNewLabel, gbc_lblNewLabel);

		JButton button_4 = new JButton("\u4FDD\u5B58\u76EE\u5F55\u64CD\u4F5C");
		GridBagConstraints gbc_button_4 = new GridBagConstraints();
		gbc_button_4.insets = new Insets(0, 0, 5, 5);
		gbc_button_4.gridx = 5;
		gbc_button_4.gridy = 0;
		panel.add(button_4, gbc_button_4);

		JScrollPane scrollPane = new JScrollPane();
		GridBagConstraints gbc_scrollPane = new GridBagConstraints();
		gbc_scrollPane.gridwidth = 7;
		gbc_scrollPane.fill = GridBagConstraints.BOTH;
		gbc_scrollPane.gridx = 0;
		gbc_scrollPane.gridy = 1;
		panel.add(scrollPane, gbc_scrollPane);

		DefaultMutableTreeNode top = new DefaultMutableTreeNode("/");
		createNodes(top);
		tree = new JTree(top);
		scrollPane.setViewportView(tree);
		tree.setEditable(true);
		tree.setDragEnabled(true);
		this.setPopupMenu();
		try {
			tree.setTransferHandler(new DocsTreeTransferHanlder());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		JPanel panel_1 = new JPanel();
		contentPane.add(panel_1, BorderLayout.CENTER);
		GridBagLayout gbl_panel_1 = new GridBagLayout();
		gbl_panel_1.columnWidths = new int[] { 708, 0 };
		gbl_panel_1.rowHeights = new int[] { 556, 0 };
		gbl_panel_1.columnWeights = new double[] { 1.0, Double.MIN_VALUE };
		gbl_panel_1.rowWeights = new double[] { 1.0, Double.MIN_VALUE };
		panel_1.setLayout(gbl_panel_1);

		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		GridBagConstraints gbc_tabbedPane = new GridBagConstraints();
		gbc_tabbedPane.fill = GridBagConstraints.BOTH;
		gbc_tabbedPane.gridx = 0;
		gbc_tabbedPane.gridy = 0;
		panel_1.add(tabbedPane, gbc_tabbedPane);

		JPanel panel_2 = new JPanel();
		tabbedPane.addTab("\u6587\u4EF6\u4E0E\u76EE\u5F55\u7BA1\u7406", null,
				panel_2, null);
		GridBagLayout gbl_panel_2 = new GridBagLayout();
		gbl_panel_2.columnWidths = new int[] { 166, 59, 0, 0, 0, 0, 0 };
		gbl_panel_2.rowHeights = new int[] { 30, 0, 49, 0, 0, 0 };
		gbl_panel_2.columnWeights = new double[] { 1.0, 0.0, 0.0, 0.0, 0.0,
				0.0, Double.MIN_VALUE };
		gbl_panel_2.rowWeights = new double[] { 0.0, 0.0, 1.0, 0.0, 0.0,
				Double.MIN_VALUE };
		panel_2.setLayout(gbl_panel_2);

		currentDirLabel = new JLabel(
				"\u5F53\u524D\u76EE\u5F55\uFF1Aone->two->three");
		GridBagConstraints gbc_lblonetwothree = new GridBagConstraints();
		gbc_lblonetwothree.gridwidth = 6;
		gbc_lblonetwothree.anchor = GridBagConstraints.WEST;
		gbc_lblonetwothree.insets = new Insets(0, 0, 5, 0);
		gbc_lblonetwothree.gridx = 0;
		gbc_lblonetwothree.gridy = 0;
		panel_2.add(currentDirLabel, gbc_lblonetwothree);

		JButton button_3 = new JButton("\u5168\u9009/\u5168\u4E0D\u9009");
		GridBagConstraints gbc_button_3 = new GridBagConstraints();
		gbc_button_3.insets = new Insets(0, 0, 5, 5);
		gbc_button_3.gridx = 3;
		gbc_button_3.gridy = 1;
		panel_2.add(button_3, gbc_button_3);

		JButton button = new JButton("\u5220\u9664");
		GridBagConstraints gbc_button = new GridBagConstraints();
		gbc_button.insets = new Insets(0, 0, 5, 5);
		gbc_button.gridx = 4;
		gbc_button.gridy = 1;
		panel_2.add(button, gbc_button);

		JButton button_1 = new JButton("\u79FB\u52A8\u5230");
		button_1.setToolTipText("\u8BF7\u5148\u9009\u62E9\u8981\u79FB\u52A8\u7684\u6587\u4EF6\uFF0C\u7136\u540E\u518D\u9009\u62E9\u4E00\u4E2A\u5DE6\u4FA7\u76EE\u5F55");
		GridBagConstraints gbc_button_1 = new GridBagConstraints();
		gbc_button_1.insets = new Insets(0, 0, 5, 0);
		gbc_button_1.gridx = 5;
		gbc_button_1.gridy = 1;
		panel_2.add(button_1, gbc_button_1);

		JScrollPane scrollPane_1 = new JScrollPane();
		GridBagConstraints gbc_scrollPane_1 = new GridBagConstraints();
		gbc_scrollPane_1.gridwidth = 6;
		gbc_scrollPane_1.insets = new Insets(0, 0, 5, 0);
		gbc_scrollPane_1.fill = GridBagConstraints.BOTH;
		gbc_scrollPane_1.gridx = 0;
		gbc_scrollPane_1.gridy = 2;
		panel_2.add(scrollPane_1, gbc_scrollPane_1);

		String[] headNames = new String[] { "\u9009\u62E9",
				"\u6587\u4EF6\u540D", "\u5927\u5C0F\uFF08KB\uFF09",
				"\u6587\u4EF6\u65E5\u671F", "\u4F5C\u8005", "", "\u4E0B\u8F7D" };
		Object[][] tableDatas = new Object[][] {
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null },
				{ null, null, null, null, null, null, null }, };

		table = new JTable(new DocsTableModel(headNames, tableDatas));

		table.getColumnModel().getColumn(0)
				.setCellEditor(table.getDefaultEditor(Boolean.class));
		table.getColumnModel().getColumn(0)
				.setCellRenderer(table.getDefaultRenderer(Boolean.class));

		table.getColumnModel().getColumn(0).setPreferredWidth(38);
		table.getColumnModel().getColumn(1).setPreferredWidth(206);
		table.getColumnModel().getColumn(2).setPreferredWidth(53);
		table.getColumnModel().getColumn(3).setPreferredWidth(134);
		table.getColumnModel().getColumn(4).setPreferredWidth(58);

		// hide the 5th column, it contans the filepath
		table.getTableHeader().getColumnModel().getColumn(5).setMaxWidth(0);// hide
		table.getTableHeader().getColumnModel().getColumn(5).setMinWidth(0);// hide
		table.getTableHeader().getColumnModel().getColumn(5)
				.setPreferredWidth(0);
		table.getTableHeader().getColumnModel().getColumn(5).setWidth(0);

		table.getColumnModel().getColumn(6)
				.setCellRenderer(new ButtonCellRenderer());
		table.getColumnModel().getColumn(6)
				.setCellEditor(new ButtonCellEditor(table));

		scrollPane_1.setViewportView(table);

		totalFilesNumLabel = new JLabel("\u6587\u4EF6\u603B\u6570\uFF1A0");
		GridBagConstraints gbc_totalFilesNumLabel = new GridBagConstraints();
		gbc_totalFilesNumLabel.anchor = GridBagConstraints.WEST;
		gbc_totalFilesNumLabel.insets = new Insets(0, 0, 0, 5);
		gbc_totalFilesNumLabel.gridx = 0;
		gbc_totalFilesNumLabel.gridy = 4;
		panel_2.add(totalFilesNumLabel, gbc_totalFilesNumLabel);

		curPageLabel = new JLabel(
				"\u5F53\u524D\u9875\u6570\uFF1A0| \u603B\u9875\u6570\uFF1A0");
		GridBagConstraints gbc_curPageLabel = new GridBagConstraints();
		gbc_curPageLabel.gridwidth = 2;
		gbc_curPageLabel.insets = new Insets(0, 0, 0, 5);
		gbc_curPageLabel.gridx = 2;
		gbc_curPageLabel.gridy = 4;
		panel_2.add(curPageLabel, gbc_curPageLabel);

		JButton btnNewButton = new JButton("\u4E0A\u4E00\u9875");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				prePage();
			}
		});
		GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
		gbc_btnNewButton.insets = new Insets(0, 0, 0, 5);
		gbc_btnNewButton.gridx = 4;
		gbc_btnNewButton.gridy = 4;
		panel_2.add(btnNewButton, gbc_btnNewButton);

		JButton button_2 = new JButton("\u4E0B\u4E00\u9875");
		button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				nextPage();
			}
		});
		GridBagConstraints gbc_button_2 = new GridBagConstraints();
		gbc_button_2.gridx = 5;
		gbc_button_2.gridy = 4;
		panel_2.add(button_2, gbc_button_2);

		JPanel panel_3 = new JPanel();
		tabbedPane.addTab("\u7F16\u8F91\u6587\u6863", null, panel_3, null);
		GridBagLayout gbl_panel_3 = new GridBagLayout();
		gbl_panel_3.columnWidths = new int[] { 0 };
		gbl_panel_3.rowHeights = new int[] { 0 };
		gbl_panel_3.columnWeights = new double[] { Double.MIN_VALUE };
		gbl_panel_3.rowWeights = new double[] { Double.MIN_VALUE };
		panel_3.setLayout(gbl_panel_3);
	}

	private void createNodes(DefaultMutableTreeNode top) {

		List<DefaultMutableTreeNode> nodes = DocsMgtRmi.getINS()
				.getFirstLevelDirs();

		for (DefaultMutableTreeNode one : nodes) {
			top.add(one);
		}

	}

	public void setPopupMenu() {
		final JPopupMenu pop = new JPopupMenu();
		pop.add(new AbstractAction("新增子目錄") {
			private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {
				System.out.println("Tree Add");
			}
		});
		pop.add(new AbstractAction("刪除目錄") {
			private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {
				System.out.println("Delete");
			}
		});

		tree.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				if (e.isMetaDown()) {
					pop.show(tree, e.getX(), e.getY());
				}
			}

			public void mouseClicked(MouseEvent evt) {
				if (evt.getClickCount() == 1) {

					VEachDir eDir = (VEachDir) getSelectedNode()
							.getUserObject();
					docFils = DocsMgtRmi.getINS().getFilesViaDirid(
							eDir.getDirId());

					int filesNum = docFils.size();
					currentDirLabel
							.setText("\u5F53\u524D\u76EE\u5F55\uFF1Aone->two->three,=>DirID:"
									+ eDir.getDirId());
					totalFilesNumLabel.setText("\u6587\u4EF6\u603B\u6570\uFF1A"
							+ filesNum);

					int maxNum = Math.min(maxFilesAPage, filesNum);
					if (filesNum <= maxFilesAPage) {
						curPageLabel
								.setText("\u5F53\u524D\u9875\u6570\uFF1A 1 | \u603B\u9875\u6570\uFF1A 1");
					} else {

						int totalNum = filesNum / maxFilesAPage;
						if (totalNum * maxFilesAPage < filesNum) {
							totalNum++;
						}
						curPageLabel
								.setText("\u5F53\u524D\u9875\u6570\uFF1A 1 | \u603B\u9875\u6570\uFF1A "
										+ totalNum);
					}
					curPageNum = 0;
					setDocTableValues(docFils.subList(0, maxNum));
				}
			}
		});
	}

	public void prePage() {

		if (this.curPageNum <= 0) {
			return;
		}
		int filesNum = docFils.size();
		curPageNum--;

		int totalPage = filesNum / maxFilesAPage;
		if (totalPage * maxFilesAPage < filesNum) {
			totalPage++;
		}
		curPageLabel
				.setText("\u5F53\u524D\u9875\u6570\uFF1A " + (curPageNum + 1)
						+ " | \u603B\u9875\u6570\uFF1A " + totalPage);

		setDocTableValues(docFils.subList(curPageNum * maxFilesAPage,
				Math.min((curPageNum + 1) * maxFilesAPage, filesNum)));

	}

	public void nextPage() {

		int filesNum = docFils.size();
		int totalPage = filesNum / maxFilesAPage;
		if (totalPage * maxFilesAPage < filesNum) {
			totalPage++;
		}

		if (curPageNum >= totalPage - 1) {
			return;
		}
		curPageNum++;
		setDocTableValues(docFils.subList(curPageNum * maxFilesAPage,
				Math.min((curPageNum + 1) * maxFilesAPage, filesNum)));
		curPageLabel
				.setText("\u5F53\u524D\u9875\u6570\uFF1A " + (curPageNum + 1)
						+ " | \u603B\u9875\u6570\uFF1A " + totalPage);
	}

	public void setDocTableValues(List<VEachFile> subDocs) {

		int i = 0;
		for (; i < subDocs.size(); i++) {
			table.getModel().setValueAt(false, i, 0);
			table.getModel().setValueAt(subDocs.get(i).getFileName(), i, 1);
			table.getModel().setValueAt(subDocs.get(i).getFileSize(), i, 2);
			table.getModel().setValueAt(
					subDocs.get(i).getFileDate().toLocaleString(), i, 3);
			table.getModel().setValueAt(subDocs.get(i).getFileAuthor(), i, 4);
			table.getModel().setValueAt(subDocs.get(i).getFilePath(), i, 5);
		}
		if (subDocs.size() < maxFilesAPage) {
			for (; i < maxFilesAPage; i++) {
				table.getModel().setValueAt(false, i, 0);
				table.getModel().setValueAt(null, i, 1);
				table.getModel().setValueAt(null, i, 2);
				table.getModel().setValueAt(null, i, 3);
				table.getModel().setValueAt(null, i, 4);
				table.getModel().setValueAt(null, i, 5);
			}
		}
		table.updateUI();
		table.repaint();
	}

	public DefaultMutableTreeNode getSelectedNode() {
		return (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
	}

	class DocsTableModel extends AbstractTableModel {
		private String headName[];
		private Object obj[][];
		private Class[] columnTypes = new Class[] { Boolean.class,
				Object.class, Object.class, Object.class, Object.class,
				Object.class, Object.class };

		public DocsTableModel() {
			super();
		}

		public DocsTableModel(String[] headName, Object[][] obj) {
			this();
			this.headName = headName;
			this.obj = obj;
		}

		public int getColumnCount() {
			return headName.length;
		}

		public int getRowCount() {
			return obj.length;
		}

		public Object getValueAt(int r, int c) {
			return obj[r][c];
		}

		public String getColumnName(int c) {
			return headName[c];
		}

		public Class<?> getColumnClass(int columnIndex) {
			return columnTypes[columnIndex].getClass();
		}

		@Override
		public boolean isCellEditable(int rowIndex, int columnIndex) {
			return true;
		}

		public void setValueAt(Object value, int row, int col) {
			obj[row][col] = value;
			fireTableCellUpdated(row, col);
		}
	}
}

class ButtonCellEditor extends DefaultCellEditor {

	private static final long serialVersionUID = -6546334664166791132L;
	private JButton button;
	private JTable table;

	public ButtonCellEditor(JTable table) {
		super(new JTextField());
		this.setClickCountToStart(1);
		this.initButton();
		this.table = table;
	}

	private void initButton() {
		this.button = new JButton();
		this.button.setSize(50, 15);
		this.button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ButtonCellEditor.this.fireEditingCanceled();
				System.out.println("Selected Column:"
						+ table.getSelectedColumn()
						+ ",row:"
						+ table.getSelectedRow()
						+ ",and filePath:"
						+ table.getModel()
								.getValueAt(table.getSelectedRow(), 5));
			}
		});
	}

	@Override
	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column) {
		this.button.setText("下載");
		return this.button;
	}

	@Override
	public Object getCellEditorValue() {
		return this.button.getText();
	}
}

class ButtonCellRenderer implements TableCellRenderer {
	private JButton button;

	public ButtonCellRenderer() {
		this.button = new JButton();
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		this.button.setText("下載");
		return this.button;
	}

}

其中裡面用到的製造資料的DocsMgtRmi類,支援Tree拖拽的事件響應器DocsTreeTransferHanlder,和裡面用到的兩個POJO物件VEachDir和VEachFile。

package test;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.swing.tree.DefaultMutableTreeNode;

import org.apache.log4j.Logger;

public class DocsMgtRmi {

	private final Logger logger = Logger.getLogger(DocsMgtRmi.class);
	private static DocsMgtRmi rmi = null;

	public static DocsMgtRmi getINS() {
		if (rmi == null) {
			synchronized (DocsMgtRmi.class) {
				if (rmi == null) {
					rmi = new DocsMgtRmi();
				}
			}
		}
		return rmi;
	}

	private DocsMgtRmi() {
		
	}

	public List<DefaultMutableTreeNode> getFirstLevelDirs() {

		ArrayList<DefaultMutableTreeNode> nodes = new ArrayList<DefaultMutableTreeNode>();

		DefaultMutableTreeNode fstnode = null;
		for (int i = 0; i < 10; i++) {
			VEachDir fstLevelDir = new VEachDir(i, "200" + i + "年以前規章", 0);
			fstnode = new DefaultMutableTreeNode(fstLevelDir);
			nodes.add(fstnode);
		}

		for (int i = 0; i < 10; i++) {
			VEachDir secLevelDir = new VEachDir(i, "2009年投訴建議-卷" + i, 9);
			DefaultMutableTreeNode secNode = new DefaultMutableTreeNode(
					secLevelDir);
			fstnode.add(secNode);
		}

		return nodes;
	}

	public List<VEachFile> getFilesViaDirid(int dirId) {

		ArrayList<VEachFile> files = new ArrayList<VEachFile>();
		for (int i = 0; i < 97; i++) {
			VEachFile one = new VEachFile(dirId, "天上星,亮晶晶,那是" + i + "雙雙眼睛.txt",
					1000, new Date(), "張為山", "one->two-" + i + "-<>");
			files.add(one);
		}
		return files;

	}

	public boolean saveDirChanged(List<VEachDir> dirs) {

		return true;
	}

}
package test;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.TransferHandler;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class DocsTreeTransferHanlder extends TransferHandler {
	public DocsTreeTransferHanlder() throws ClassNotFoundException {
	}

	public int getSourceActions(JComponent c) {
		return MOVE;
	}

	@Override
	protected Transferable createTransferable(JComponent c) {
		JTree tree = (JTree) c;
		TreePath[] paths = tree.getSelectionPaths();
		ArrayList nodes = new ArrayList();
		for (TreePath path : paths) {
			nodes.add(path.getLastPathComponent());
		}
		return new JTreeTransferable(nodes);
	}

	@Override
	protected void exportDone(JComponent source, Transferable data, int action) {
	}

	@Override
	public boolean canImport(TransferSupport support) {
		if (support.isDataFlavorSupported(JTreeTransferable.FLAVOR)) {
			if (support.getDropAction() == MOVE)
				return true;
		}
		return false;
	}

	@Override
	public boolean importData(TransferSupport support) {
		JTree tree = (JTree) support.getComponent();
		DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
		Transferable transfer = support.getTransferable();
		try {
			List<DefaultMutableTreeNode> nodes = (List<DefaultMutableTreeNode>) transfer
					.getTransferData(JTreeTransferable.FLAVOR);
			JTree.DropLocation location = (JTree.DropLocation) support
					.getDropLocation();
			DefaultMutableTreeNode newParent = (DefaultMutableTreeNode) location
					.getPath().getLastPathComponent();
			for (DefaultMutableTreeNode node : nodes) {
				model.removeNodeFromParent(node);
				model.insertNodeInto(node, newParent, newParent.getChildCount());
			}
		} catch (UnsupportedFlavorException e) {
			e.printStackTrace();
			return false;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
}

class JTreeTransferable implements Transferable {
	public static DataFlavor FLAVOR = null;
	private List<DefaultMutableTreeNode> nodes;

	JTreeTransferable(ArrayList<DefaultMutableTreeNode> nodes) {
		try {
			FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType
					+ ";class=\"" + ArrayList.class.getName() + "\"");
			this.nodes = nodes;
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public Object getTransferData(DataFlavor flavor)
			throws UnsupportedFlavorException, IOException {
		return nodes;
	}

	public DataFlavor[] getTransferDataFlavors() {
		return new DataFlavor[] { FLAVOR };
	}

	public boolean isDataFlavorSupported(DataFlavor flv) {
		return FLAVOR.equals(flv);
	}
}
package test;

import java.util.Date;

public class VEachFile {

	private int dirId;
	private String fileName;
	private int fileSize;
	private Date fileDate;
	private String fileAuthor;
	private String filePath;

	public VEachFile(int dirId, String fileName, int fileSize, Date fileDate,
			String fileAuthor, String filePath) {
		super();
		this.dirId = dirId;
		this.fileName = fileName;
		this.fileSize = fileSize;
		this.fileDate = fileDate;
		this.fileAuthor = fileAuthor;
		this.filePath = filePath;
	}

	public int getDirId() {
		return dirId;
	}

	public void setDirId(int dirId) {
		this.dirId = dirId;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public int getFileSize() {
		return fileSize;
	}

	public void setFileSize(int fileSize) {
		this.fileSize = fileSize;
	}

	public Date getFileDate() {
		return fileDate;
	}

	public void setFileDate(Date fileDate) {
		this.fileDate = fileDate;
	}

	public String getFileAuthor() {
		return fileAuthor;
	}

	public void setFileAuthor(String fileAuthor) {
		this.fileAuthor = fileAuthor;
	}

	public String getFilePath() {
		return filePath;
	}

	public void setFilePath(String filePath) {
		this.filePath = filePath;
	}

}
package test;

public class VEachDir {

	private int dirId;
	private String dirName;
	private int parentDirId;

	public VEachDir(int dirId, String dirName, int parentDirId) {
		super();
		this.dirId = dirId;
		this.dirName = dirName;
		this.parentDirId = parentDirId;
	}

	public int getDirId() {
		return dirId;
	}

	public void setDirId(int dirId) {
		this.dirId = dirId;
	}

	public String getDirName() {
		return dirName;
	}

	public void setDirName(String dirName) {
		this.dirName = dirName;
	}

	public int getParentDirId() {
		return parentDirId;
	}

	public void setParentDirId(int parentDirId) {
		this.parentDirId = parentDirId;
	}

	public String toString() {

		return this.dirName;
	}

}