replicatedtreedemo.java
来自「JGRoups源码」· Java 代码 · 共 716 行 · 第 1/2 页
JAVA
716 行
// $Id: ReplicatedTreeDemo.java,v 1.7 2005/06/14 08:36:49 belaban Exp $package org.jgroups.demos;import org.jgroups.View;import org.jgroups.blocks.ReplicatedTree;import javax.swing.*;import javax.swing.event.TableModelEvent;import javax.swing.event.TableModelListener;import javax.swing.event.TreeSelectionEvent;import javax.swing.event.TreeSelectionListener;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableColumn;import javax.swing.tree.*;import java.awt.*;import java.awt.event.*;import java.io.File;import java.util.*;/** * Graphical view of a ReplicatedTree * * @author Bela Ban */public class ReplicatedTreeDemo { /** * Graphical view of a ReplicatedTree (using the MVC paradigm). An instance of this class needs to be given a * reference to the underlying model (ReplicatedTree) and needs to registers as a ReplicatedTreeListener. Changes * to the tree structure are propagated from the model to the view (via ReplicatedTreeListener), changes from the * GUI (e.g. by a user) are executed on the tree model (which will broadcast the changes to all replicas).<p> * The view itself caches only the nodes, but doesn't cache any of the data (HashMap) associated with it. When * data needs to be displayed, the underlying tree will be accessed directly. * * @author Bela Ban */ static class ReplicatedTreeView extends JFrame implements WindowListener, ReplicatedTree.ReplicatedTreeListener, TreeSelectionListener, TableModelListener { DefaultTreeModel tree_model=null; JTree jtree=null; final DefaultTableModel table_model=new DefaultTableModel(); final JTable table=new JTable(table_model); final MyNode root=new MyNode(SEP); final String props=null; String selected_node=null; ReplicatedTree tree=null; // the underlying model JPanel tablePanel=null; JMenu operationsMenu=null; JPopupMenu operationsPopup=null; JMenuBar menubar=null; static final String SEP=ReplicatedTree.SEPARATOR; private static final int KEY_COL_WIDTH=20; private static final int VAL_COL_WIDTH=300; public ReplicatedTreeView(ReplicatedTree tree, Object title) throws Exception { this.tree=tree; tree.addReplicatedTreeListener(this); addNotify(); setTitle("ReplicatedTreeDemo: mbr=" + title); tree_model=new DefaultTreeModel(root); jtree=new JTree(tree_model); jtree.setDoubleBuffered(true); jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); JScrollPane scroll_pane=new JScrollPane(jtree); populateTree(); getContentPane().add(scroll_pane, BorderLayout.CENTER); addWindowListener(this); table_model.setColumnIdentifiers(new String[]{"Name", "Value"}); table_model.addTableModelListener(this); setTableColumnWidths(); tablePanel=new JPanel(); tablePanel.setLayout(new BorderLayout()); tablePanel.add(table.getTableHeader(), BorderLayout.NORTH); tablePanel.add(table, BorderLayout.CENTER); getContentPane().add(tablePanel, BorderLayout.SOUTH); jtree.addTreeSelectionListener(this);//REVISIT MouseListener ml=new MouseAdapter() { public void mouseClicked(MouseEvent e) { int selRow=jtree.getRowForLocation(e.getX(), e.getY()); TreePath selPath=jtree.getPathForLocation(e.getX(), e.getY()); if(selRow != -1) { selected_node=makeFQN(selPath.getPath()); jtree.setSelectionPath(selPath); if(e.getModifiers() == java.awt.event.InputEvent.BUTTON3_MASK) { operationsPopup.show(e.getComponent(), e.getX(), e.getY()); } } } }; jtree.addMouseListener(ml); createMenus(); setLocation(50, 50); setSize(getInsets().left + getInsets().right + 485, getInsets().top + getInsets().bottom + 367); init(); setVisible(true); } public void windowClosed(WindowEvent event) { } public void windowDeiconified(WindowEvent event) { } public void windowIconified(WindowEvent event) { } public void windowActivated(WindowEvent event) { } public void windowDeactivated(WindowEvent event) { } public void windowOpened(WindowEvent event) { } public void windowClosing(WindowEvent event) { System.exit(0); } public void tableChanged(TableModelEvent evt) { int row, col; String key, val; if(evt.getType() == TableModelEvent.UPDATE) { row=evt.getFirstRow(); col=evt.getColumn(); if(col == 0) { // set() key=(String)table_model.getValueAt(row, col); val=(String)table_model.getValueAt(row, col + 1); if(key != null && val != null) { tree.put(selected_node, key, val); } } else { // add() key=(String)table_model.getValueAt(row, col - 1); val=(String)table.getValueAt(row, col); if(key != null && val != null) { tree.put(selected_node, key, val); } } } } public void valueChanged(TreeSelectionEvent evt) { TreePath path=evt.getPath(); String fqn=SEP; String component_name; HashMap data=null; for(int i=0; i < path.getPathCount(); i++) { component_name=((MyNode)path.getPathComponent(i)).name; if(component_name.equals(SEP)) continue; if(fqn.equals(SEP)) fqn+=component_name; else fqn=fqn + SEP + component_name; } data=getData(tree, fqn); if(data != null) { getContentPane().add(tablePanel, BorderLayout.SOUTH); populateTable(data); validate(); } else { clearTable(); getContentPane().remove(tablePanel); validate(); } } /* ------------------ ReplicatedTree.ReplicatedTreeListener interface ------------ */ public void nodeAdded(String fqn) { MyNode n, p; n=root.add(fqn); if(n != null) { p=(MyNode)n.getParent(); tree_model.reload(p); jtree.scrollPathToVisible(new TreePath(n.getPath())); } } public void nodeRemoved(String fqn) { MyNode n; TreeNode par; n=root.findNode(fqn); if(n != null) { n.removeAllChildren(); par=n.getParent(); n.removeFromParent(); tree_model.reload(par); } } public void nodeModified(String fqn) {// HashMap data; // data=getData(tree, fqn); //populateTable(data); REVISIT /* poulateTable is the current table being shown is the info of the node. that is modified. */ } public void viewChange(View new_view) { Vector mbrship; if(new_view != null && (mbrship=new_view.getMembers()) != null) { tree._put(SEP, "members", mbrship); tree._put(SEP, "coordinator", mbrship.firstElement()); } } /* ---------------- End of ReplicatedTree.ReplicatedTreeListener interface -------- */ /*----------------- Runnable implementation to make View change calles in AWT Thread ---*/ public void run() { } /* ----------------------------- Private Methods ---------------------------------- */ /** * Fetches all data from underlying tree model and display it graphically */ void init() { Vector mbrship=null; addGuiNode(SEP); mbrship=tree != null && tree.getMembers() != null ? (Vector)tree.getMembers().clone() : null; if(mbrship != null) { tree._put(SEP, "members", mbrship); tree._put(SEP, "coordinator", mbrship.firstElement()); } } /** * Fetches all data from underlying tree model and display it graphically */ private void populateTree() { addGuiNode(SEP); } /** * Recursively adds GUI nodes starting from fqn */ void addGuiNode(String fqn) { Set children; String child_name; if(fqn == null) return; // 1 . Add myself root.add(fqn); // 2. Then add my children children=tree.getChildrenNames(fqn); if(children != null) { for(Iterator it=children.iterator(); it.hasNext();) { child_name=(String)it.next(); addGuiNode(fqn + SEP + child_name); } } } String makeFQN(Object[] path) { StringBuffer sb=new StringBuffer(""); String tmp_name; if(path == null) return null; for(int i=0; i < path.length; i++) { tmp_name=((MyNode)path[i]).name; if(tmp_name.equals(SEP)) continue; else sb.append(SEP + tmp_name); } tmp_name=sb.toString(); if(tmp_name.length() == 0) return SEP; else return tmp_name; } void clearTable() { int num_rows=table.getRowCount(); if(num_rows > 0) { for(int i=0; i < num_rows; i++) table_model.removeRow(0); table_model.fireTableRowsDeleted(0, num_rows - 1); repaint(); } } void populateTable(HashMap data) { String key, strval="<null>"; Object val; int num_rows=0; Map.Entry entry; if(data == null) return; num_rows=data.size(); clearTable(); if(num_rows > 0) { for(Iterator it=data.entrySet().iterator(); it.hasNext();) { entry=(Map.Entry)it.next(); key=(String)entry.getKey(); val=entry.getValue(); if(val != null) strval=val.toString(); table_model.addRow(new Object[]{key, strval}); } table_model.fireTableRowsInserted(0, num_rows - 1); validate(); } } private void setTableColumnWidths() { table.sizeColumnsToFit(JTable.AUTO_RESIZE_NEXT_COLUMN);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?