Swing完整实例 JTree(右键菜单,可拖拽)+JTable(可翻页,列中含有按钮,隐藏列)

Swing完整实例 JTree(右键菜单,可拖拽)+JTable(可翻页,列中含有按钮,隐藏列)
Swing完整实例 JTree(右键菜单,可拖拽)+JTable(可翻页,列中含有按钮,隐藏列)

首先来看一下展示界面,JTree的特点有:节点可拖拽,根据输入生成目录,右键有菜单,点击触发事件等

JTable的特点有:含有隐藏列,可以进行翻页,列中含有下载按钮等

在来看一下代码吧,基本代码由Eclipse上的WindowBuilder进行拖拽式产生的,所以看起来有点乱,不过没事

在使用WindowBuilder的时候要画JTree和JTable时要注意,这两个有几个共同点,必须放到JScrollPanel中,因为这两个控件的内容长度会发生突然变化,所以要使用JScrollPanel。

BTW:如果要使用WindowBuidler,除了在Eclipse上安装插件,最方便的方法是直接下载含有该插件的Eclipse版本:

https://www.360docs.net/doc/3e15693518.html,/downloads/packages/eclipse-ide-java-developers/keplerr

package test;

import java.awt.BorderLayout;

import https://www.360docs.net/doc/3e15693518.html,ponent;

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 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\u 4E00\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[50][7];

for (int i = 0; i < 50; i++) {

for (int j = 0; j < 7; j++) {

tableDatas[i][j] = 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 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 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;

}

}

关于上面的TableCellRenderer子类和CellEditor子类,这两个都被设置到table的ColumnModel中了,ButtonCellRenderer在每次GUI渲染的时候都会调用,ButtonCellEditor只会在点击到这个Cell的时候才会调用,并且如果失去焦点后return的Component将消失,所以ButtonCellRenderer这个很重要。table.getColumnModel().getColumn(7).setCellRenderer(new ButtonCellRenderer());table.getColumnModel().getColumn(7).setCellEditor(new ButtonCellEditor(table));

可以在ButtonCellRenderer中加上一些逻辑,用来判断是否显示按钮,比如在初始化的时候不要显示按钮,比如可以可以根据隐藏列的值显示按钮,只要修改getTableRenderComponent方法即可。

public Component getTableCellRendererComponent(JTable table, Object value,

boolean isSelected, boolean hasFocus, int row, int column) {

String filePath = (String) table.getModel().getValueAt(row, 7);

if (filePath == null) {

return null;

} else {

this.button.setText("下载");

return this.button;

}

}

下面讲一下支持Tree拖拽的事件响应器DocsTreeTransferHanlder,TransferHanlder用来处理Transferable一个Swing Component对象上的transfer to和from,就是拖拽,而Transferable对象代表通过剪切到,拷贝自剪贴板上的数据对象。

这几个对象被用来实现拖拽,TansferHanlder对拖拽支持良好,开发者只需要实现一个具体的Transfer对象,然后将hanlder设置到Swing组件上。

Please see How to Use Drag and Drop and Data Transfer, a section in The Java Tutorial, for more information.

简单的说,通过TransferHandler来实现拖拽,首先要创建Transferable对象JTreeTransferable,然后比较重要的是ImportData和exportDone方法,在importData方法中可以通过Support对象获取DropLocation,然后通过TreePath的getLastPathComponent方法得到拖拽的目标Tree对象结点,继而通过getUserObject可以获得之前自定义的放到TreeNode的用户数据,如下面下面四句:

JTree.DropLocation location = (JTree.DropLocation) support.getDropLocation();

DefaultMutableTreeNode newParent = (DefaultMutableTreeNode) location.getPath().getLastPathComponent();

VEachDir eDir = (VEachDir) newParent.getUserObject();

System.out.println("The drage after NewParent DirName:"+ eDir.getDirName() + ",DirID:" + eDir.getDirId());

显然按照之前的理论Transfer中放置的是被移动的对象,则通过下面的两句就可以得到被移动对象的结点列表,要注意的是这个地方是列表,即表示拖拽时可以使用Shift来选择多个结点进行拖拽到一个目标结点!

Transferable transfer = support.getTransferable();

List nodes = (List) transfer.getTransferData(JTreeTransferable.FLAVOR);

由此可见通过拖拽过程的实现,最重要的一个类是TransferHandler.TransferSupport 类,这个类中包含了目的树节点和源节点列表,最重要的是,我们可以不用丝毫关心Support怎么做到的,只要记住怎么获取源和目的就行了。

当然在拖拽之前,实现TranseferHanlder最重要的就是创建自己的Transferable对象,这个其实也比较简单,就两点(1)创建Favor (2)塞入TreeNodes 就可以了

由此可见Swing实现JTree的拖拽非常强大吧!

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;

import com.car.cs.pojodata.VEachDir;

public class DocsTreeTransferHanlder extends TransferHandler {

private static final long serialVersionUID = 1910170308494195795L;

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) {

System.out.println("ImportData");

JTree tree = (JTree) support.getComponent();

DefaultTreeModel model = (DefaultTreeModel) tree.getModel();

Transferable transfer = support.getTransferable();

try {

List nodes = (List) transfer

.getTransferData(JTreeTransferable.FLAVOR);

JTree.DropLocation location = (JTree.DropLocation) support

.getDropLocation();

DefaultMutableTreeNode newParent = (DefaultMutableTreeNode) location

.getPath().getLastPathComponent();

VEachDir eDir = (VEachDir) newParent.getUserObject();

System.out.println("The drage after NewParent DirName:"

+ eDir.getDirName() + ",DirID:" + eDir.getDirId());

for (DefaultMutableTreeNode node : nodes) {

eDir = (VEachDir) node.getUserObject();

System.out.println("Before Drag the Node DirName:"

+ eDir.getDirName());

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 nodes;

public JTreeTransferable(ArrayList 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);

}

}

其中里面用到的制造数据的DocsMgtRmi类,和里面用到的两个POJO对象VEachDir和VEachFile。

package test;

import https://www.360docs.net/doc/3e15693518.html,.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 getFirstLevelDirs() {

ArrayList nodes = new ArrayList();

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 getFilesViaDirid(int dirId) {

ArrayList files = new ArrayList();

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 dirs) {

return true;

}

}

两个实体类VEachFile和VEachDir

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;

java swing布局管理器

学籍管理系统 Java Swing布局管理器 科尔沁艺术职业学院计算机科学与技术系2008级(普理)班曹容赫 指导教师苏春源 摘要:院校规模不断扩大,学生数量不断增多,原来的人工记录的方式,甚至是一般的数据存储管理软件不能满足学生管理的需求。传统管理方式维护数据性能低、查询信息不方便、选课效率低、维护成绩信息的工作量大,为弥补以上缺陷,便于信息管理与维护,提高管理效率,从而开发此学籍管理系统,以实现学院的信息化管理。 关键词Java.*Swing 用户名管理 Kerqin Art Institute of evaluating teaching career system Kerqin Art Vocational College, Department of Computer Science and Technology 2008 (2)Cao ronghe Abstract:The institutions have been expanding, increasing the number of students, the original way of manual records, or even a general data storage management software can not meet the management needs of students. Performance of the traditional low-maintenance data management, query information is not convenient, course selection, low efficiency, heavy workload to maintain performance information for more than make up for deficiencies, facilitate information management and maintenance, and improve management efficiency, in order to develop the school management system to achieve School of Information Management. Key words java*swing The user's name manages 引言 为了学院更方便的管理各院系开设的课程,让学生更方便地选课并及时了解个人课程及成绩信息,同时提高学院的信息化水平,学籍管理系统对成绩管理、学籍管理、班级管理、课程设置、选课信息等几个方面进行管理,真正实现管理信息化,且弥补了过去传统的数据信息管理的低效率问题。 1、需求分析 经过讨论此系统的开发是有必要的,针对此系统的使用群体有学生、家长、教师等。此系统可以根据相应信息对学生信息进行更有效的管理。还应用了Java *Swing 来编写主体布局界面,使操作更简单、更实用。

java任意窗口布局

package login; import java.awt.Color; import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class Login extends JFrame{ /** * @param args * 登陆窗口 */ private JLabel userId_label; private JLabel userPass_label; private JTextField userId_field; private JTextField userPass_field; private JButton ok_button; private JButton cancle_button; private JPanel mainPanel; JFrame frame; int frame_width;//窗口的宽度 int frame_height;//窗口的高度 public Login(){ Toolkit toolKit = Toolkit.getDefaultToolkit(); Dimension dimension = toolKit.getScreenSize(); int width =dimension.width; //屏幕的宽度 int height =dimension.height;//屏幕的宽度 frame_width = width/3; frame_height = height/3; buildPanel(frame_width,frame_height);//新建面板 this.setTitle("酒店管理系统"); this.setSize(frame_width,frame_height); this.setLocation(frame_width, frame_height); this.setContentPane(mainPanel);

易经入门(最全解答)

易经入门(最全解答) 对于周易的迷途者,可能需要找些入门的书籍,建议。但是百度,网站等会经常变动,比如我之前找到一个周易入门的好网站,是从百度里面搜到的,过几天就搜不到了,后悔当时没有收藏网站,所以现在把之前积累的公布出来建议或书籍发布出来,大家收藏一下。 (1)这个比较全面客观的: 数目有很多,建议你你有整体的观念,这样会比较容易学。以下这段介绍,是我保存的,觉得很好,希望对你有用。 选书如选老师,因此选择书籍是一件十分重要的事。在此,向给大家推荐相关书籍,让你少走弯路,成为大师级高手! 重要叮嘱 易学、佛经是迷宫,进门后一定要学会出得了门。正如紫钦天老师在《太极博弈原理》里面“信息对抗:命越算越薄,知命与宿命”提到的,其实现在才最真实的,人要克服的是未来信息对现在的影响!很多人能懂一点点了,以为天下无敌,但是如果未来的信息,没有百分百准确,都是误导人的。最怕三分真,七分假。人依然会迷茫,犹豫,错失。 另外,易曰:知得也要知丧,当你得到了一些东西的时候,你也会失去一些东西。诚然,人生从某种意义上讲,没有绝对的好、坏、善、恶,而在于你的选择。为什么还要特别提醒呢?因在现实中接触不少易友,一学什么易或练什么功,就顾及不到其他方面,给家庭社会造成一些不好的影响。古曰:平常心是道!不要把自己标榜成与别人不一样,否则你会一事无成。要明白你只是一个凡人,不要以为自己学易了就有什么了不起。法、侣、财、地(简单讲就是方法、同道、财力、环境)是学好功法,其实也是学好易经的最好指导。千万不要指望学易来发大财,否则你将走上不归路。以此为职业的人,是有宿因的。薄迦梵歌曰:要把成与败、得于失等同看待。患得患失不是学易人应有的心态。好好工作,养家糊口,业余修习,平凡一生这是吾师给本人的开示和指导,希望易友也能从中得到启发! 最后以一句话与大家共勉:天行健,君子以自强不息;地势坤,君子以厚德载物!众善奉行,诸恶莫作最为紧要! 1、基础书 (1)周易原文注解类: 如果不读周易原文,而想彻底搞懂周易基本是不可能的,万丈高楼平地起,基础越牢,对后面的学习帮助越大。 建议采用中国易经协会会长、哲学教授刘大钧著的《周易概论》,其他如上海古籍出版社、商务印书馆等较大的出版社出版的《周易》都是比较可靠的。 南怀瑾老师倡导的儿童经典导读中心出版的原文《易经》,可以帮助大家认识和听懂一些难读的字。 (2)周易精华思想融汇类: 应该说,目前只有紫钦天老师的《太极博弈原理》一书能做到这点,全书中是没有解释卦象的。但是如果对于一个研究周易几十年的学者来说,一看这书,应该明白其实里面是是蕴含

Java swing布局详解(附示例图)

当选择使用JPanel和顶层容器的content pane时,需要考虑布局管理。JPanel缺省是初始化一个FlowLayout,而content pane缺省是初始化一个BorderLayout。 下面将分别介绍几种最常用的布局管理器:FlowLayout、BorderLayout、BoxLayout、CardLayout、GridLayout和GridBagLayout。 代码演示 每一个布局管理器都会有一个代码演示,xxxLayoutDemo.java(见附件)。这些文件主要有三个方法组成: addComponentsT oPane()提供布局逻辑(依据不同的布局管理器和UI内容)。 Java代码 1public static void addComponentsT oPane(Container pane) {。。。} 2/** 3*createAndShowGUI()实例化一个JFrame,通过它的ContentPane加载布局逻辑内容。 4*/ 5private static void createAndShowGUI() { 6// Create and set up the window. 7JFrame frame = new JFrame("FlowLayoutDemo"); 8frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 9// Set up the content pane. 10addComponentsT oPane(frame.getContentPane()); 11// Display the window. 12frame.pack(); 13frame.setVisible(true); 14} 15//main()程序入口,单独起一个线程,实例化UI。 16public static void main(String[] args) {

太极化形

太极化形地理要诀 自序 且自孔子而后,斯文同骨肉,惟有地理不一家也,盖自古圣贤所创,阴阳五行,浑包天地万物,是有理而無形,理为一本,形为万殊,千变万化,甚难图也。而后世之人,遵圣道分其条目者,百家各有所师,惟有地理,無所遵者也,差错讹谬,背乎性理,此何故也?因古人草率無形,令人阅之不明,含渾無图,復行错认而不自知,故为细加搜剔,草率者详之,重复者删之,不足者补之,另行刻刊。使清纯不杂,庶地理异日可归於一家焉,况今清明二代,地理失传久矣,余作此书,遵沈公地学之形,绘其图像。明乾坤法窍之理,辩其伪真,学者以此为门路,則於隂陽理性之道,未必無小补云。 序 且地理之说,由来久矣,地理之书,亦甚繁矣,问其说,不曰天星遊年,即曰五音卦例,睹其书,非拘泥于星峰砂水,即拘泥乎黄泉会局,求其有合乎太极动静之理,五行造化之用者,百中無一,然彼非不言太极,而实不知太极之所以动静,实不知五行之所以造化。其不知所以动静造化者,縂由於不识地理之隂陽,穴星之向背,相地入乎先观穴星之向背,次察五行之形体,孰阴孰阳,不必求合乎太极,而太极动静之理,自無不含矣,以此寻龍察脉,认穴定向,如在掌握,独怪今时之師,五行莫辩隂陽不分,自诩深识地理,郎有人延卜地,虽十日半月,未能得一吉地。不曰天星不合,即曰卦例不吉,不曰峰水有石疑,即云泉局不利。如是以云卜地,未有能得真地者也,如是

为之葬人,未有不害人者也,余有感而笔於此,庶使后人不受其害,而吾師之道,得以传焉。 太极化形地理要诀 太极为地理子纲,地理要诀可知矣,夫地理不能离乎太极也,明太极者,不诚可知地理要诀哉,且古今地理不離太极,所患者人多昧耳,昧乎比則不能识太极变化之道,亦不能本太极会之会,难多言地理乎,要难卜云其吉矣。今夫太极,在天成象可观,太极在地成形可察,此中之变化無穷也。就生化之五者言之,水火木金土定也,故以五者定其形,即於色味方位预卜凶之兆,就生之四者观之,窝钳乳突是也,故以四者相其局。即於向皆运近,先知祸福之机。然则考夫地理者,可忽太极化生之機乎,而太极化形地理可考矣。 大地层次先天为体,后天为用。何为先天体?龍虎外扩,外坐山、内坐山、内外映山。何为后天为用?穴場隂陽,陽長高隂長高,隂陽皆低以中限高为行,至於结穴多不平,不识阴阳不能用,阴面如鏊背,阳面如掉平,阴属黑,阳属白,如太极之半黑半白也。 小地层次后天为体,先天为用。何为后天体?四面土色前后土左右土,於中不一,其中必有宝色。何为后天用?八方生旺,艮向丙離向庚先后皆合,必兼中有分金。至於穴場多平正,不识土色不能用,陽土有光华,隂土無气色,阴土湿,陽土干如太极之一半纯白也。纯白無黑,黑在穴后,或高或低,必有鏊背之形。半黑半白,黑在左右或平或仄,亦有阴阳之理,合於太极不亦宜乎。地理要诀在太极,而太极尚矣,夫地理千变万化,非太极無以绳之也,則要诀不在乎且以

薛传正:易林愚公的习易之路

薛传正:易林愚公的习易之路 今日记者有幸采访薛传正老师,经介绍得知薛传正老师现任中华周易名家协会青岛分会会长、常务理事、学术委员会委员、高级预测师、会员等职务。薛传正老师在多年的习易道路上有很多的感悟,今天让我们来聆听薛传正老师30余年来一直不间断的研习易学文化的心声。 记者问:“关于《周易》是迷信的说法,您怎么看?” 薛传正老师答道:“《周易》是中国周代的典箱,被尊为“群经之首,诸子百家之源”,西方文明有《圣经》,东方文明有《周易》。周易文化是中华文化发展的根本与源头,对中国后来历代的政治、经济、文化等诸多方面都产生巨大而又深远的影响,中国的建筑、医学、音乐、绘画、日常生活等无不与《周易》有着千丝万缕的联系,乃至影响到中国人的民族性格与民族精神。如:“天行健君子以自强不息,地势坤君子以厚德载物;”孔子读易、韦编三绝,他的千古名言“生死有命,富贵在天”就连《论语》中也多处引用《周易》的词语。”

记者问:“您是怎样与周易文化结缘的呢?” 薛传正老师答道:“我孩提时受祖父的影响,祖父酷爱中华民族的传统文化(如符咒文化),擅长中医,为当地百姓医治疑难杂症,在家乡享有盛名,我从小受祖父耳闻目睹,印上了周易的烙印,从此激起了学习周易的兴趣;记得,我六岁时,家父放在炕席下的用来护家防身的小土枪,我信手拿着玩耍,姐姐怕我出危险,拼命从我手中夺抢,我生气地把小土枪摔在墙上,土枪走火打在我屁股上,疼痛难忍,血流不止,我祖父运用周易符咒即止血咒给我止住血,顿时疼痛消失,从那以后我对周易文化产生了浓厚的兴趣;在八四年偶遇一周易高人,老人家说:“你在31--35岁几年,会出现经济拮据及官非”,结果在1989年生育二胎,夫人因孩子小而辞去了工作,只靠我自己的收入维持四口人的家庭,生活相当拮据。从那以后更深深爱上了易经,一发不可收拾;自此开始先后研读了命理类书:邵伟华老师的《四柱预测学》李后启老师的《秀枝命理》、《算命100法》、刘文元老师的《四柱正源》以及《三命通会》、《穷通宝鉴》、《滴天髓》、《神峰通考》;风水类:《阴宅三要》、《阳宅爱众》、《堪舆大全》、《阳宅十书》、《八宅明镜》、《阴阳宅大全》、《入地神眼》、《地理五诀》、《雪心赋》、《沈氏玄空学》、《地理啖蔗录》、《金锁玉关》、《地理辨证疏》、《宅经》、秦伦诗老师的《风水》,韩少清的《玄空风水精论》,钟义明的《玄空操作实务》、朱镇强的《择吉安居》;八卦类:邵伟华老师的《周易预测学》、《筮府珠林》;奇门类:张志春老师的《神奇之门》、《开悟之门》,杜新会老师的《奇门遁甲现代实例精解》,石建国老师的《奇门遁甲解真》,刘文元老师的《奇门启悟》,李万福老师的《奇门与四柱》,刘广斌老师的 《奇门预测学》以及《奇门遁甲统综》、《金函玉匣奇门遁甲》、《奇门归旨》;择

Swing常见布局管理器总结

1、BorderLayout 边界布局管理器 北区:页首(PAGE_START)north 南区:页尾(PAGE_END)south 西区:行首(LINE_START) west 东区:行尾(LINE_END)east 我们也可以在内容窗格的顶头放置工具栏,底部放置状态栏 工具栏和状态栏的高度都是不变的,但长度随框架大小而改变 这正好是边界型布局的北区、南区的特点 因此,北区和南区可以放置工具栏和状态栏,同时会根据框架的大小自动调整面板、工具栏和状态栏的大小 对于此类界面,可以将主工作区放在中间区里,辅助工具区放在周边的东、南、西、北四个区域的某一个区域中: 缺省情况下,边界型布局的各区之间没有空隙,组件彼此靠在一起 可以指定区域间的水平间隙和垂直间隙: JPanel panel = new JPanel(); panel.setLayout(new BorderLayout(5, 5)); 2、BoxLayout(盒子布局器) 它没有空构造函数,必须给出两个参数: 需要它管理的容器对象 组件排列的轴线方向,轴线方向有两种: LINE_AXIS(或者X_AXIS)表示组件按横线排成一行; PAGE_AXIS(或者Y_AXIS)表示组件按纵向排成一列 组件的对齐方式(Alignment): 对于纵向排列的组件,有3种对齐方式: btn1.setAlignmentX(Component.LEFT_ALIGNMENT); btn1.setAlignmentX(Component.CENTER_ALIGNMENT); btn1.setAlignmentX(Component.RIGHT_ALIGNMENT); 对齐方式是组件本身的性质,而不是布局管理器的性质。因此,你需要调用每个组件本身的setAlignmentX函数来设定对齐方式

java Swing心得

Java Swing 心得 本周做了一个java的C/S模式的程序,让我学习到了C/S的开发,虽然只是一个很小的程序,但是下次再做的话就不会生疏,这次做的还有很多不足的地方,随着以后的深入了解,我相信会做的更好。下面我们来谈谈java Swing。 Swing是一种java语言开发窗口程序的工具包,是以抽象的工具类AWT(Abstract Windows Toolkit)为基础发展而来,由于AWT 的一些重要功能还有所欠缺,于是就出现了Swing,但并不是抛弃了AWT,一些重要的工具仍然保存,但是Swing在选择上还是成为了开发的首选。 Swing中是由组件构成的,他的组件可以分为两种类型,一种是JComponent类和Window类,Window类可以独立显示,不依靠任何组件,比如JFrame,JComponent类是不能独立显示,而要依靠组件来显示,比如JButton就要依靠JFrame来显示,Swing包中的组件又可以分为三种类型,顶层组件,中间组件和基础组件,顶层组件有:JFrame,JApplet,JDialog,JWindow;中间组件大多就是承担一个容器的作用,比如JPanel,JScrollpane,JSplitpane,JToolBar;基础组件就是 JButton,JComboBox,JList,JMean,JSlider,JTextField,这些组件必须要依靠中间组件来显示,由此可见,基础组件必须要依靠中间组件,而中间组件必须要依靠顶层容器来显示,在建一个窗口程序

的时候必须实例化组件,不然会报异常,组件没有实例化,实例化之后顶层组件.add(中间组件),中间组件.add(基本组件),想要什 么效果直接实例化组件,然后添加到容器里,一个窗口想要美观,就需要布局,常用的布局有GridBagConstraints来控制你的组件摆放的位置,一般来会创建一个add方法,gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insert, ipadx, ipady,都是其中的参数gridx:横坐标;gridy:纵坐标;gridwidth:橫占一个单元格;gridheight:列占一个单元格;weightx:当窗口放大时,长度不变;weighty:当窗 口放大时,高度不变,anchor = GridBagConstraints.NORTH; 当组件 没有空间大时,使组件处在北fill=GridBagConstraints. BOTH,当格子有剩余空间时,填充空间,insert = new Insets(0, 0, 0, 0); 组件彼此的 间距,ipadx = 0; 组件内部填充空间,即给组件的最小宽度添加多大 的空间ipady = 0; 组件内部填充空间,即给组件的最小高度添加多大 的空间通过这个组件就可以布置你想要的布局,如果你想更加美观,就可以使用JInternalFrame来美化窗口,当然Swing中还有JList,JTable都可以显示数据可以从数据库操作数据展示出来,其中JList 是以数组的形式存储数据,使用list.SetListData (数组)来展示数据,也可以在list窗口添加滚动条,以免数据太多而展示不完全,每个控件都有自己的方法,都是实例化一个什么样的组件,带标题,带icon的图标,后有自己的取值,赋值方法都有启用或者禁用组件或者当前组件可不可见的方法,会让你的程序变得几行代码就可以实现一个操作,特别是按钮或者菜单的功能的实现,使用监听会

相关文档
最新文档