package com.vci.client.uif.engine.client.compare.dialog; import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Frame; import java.awt.Point; import java.awt.Rectangle; import java.awt.Window; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import java.util.Map; import java.util.TreeSet; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.JViewport; import javax.swing.WindowConstants; import javax.swing.border.Border; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import com.vci.client.uif.engine.client.compare.Comparer; import com.vci.client.uif.engine.client.compare.attribute.Attdef; import com.vci.client.uif.engine.client.compare.dialog.treenode.CompareTreeNode; import com.vci.client.uif.engine.client.compare.dialog.treenode.TreeNodeObject; import com.vci.client.uif.engine.client.compare.enumeration.CompareState; /** * 比较窗口 * @author VCI-STGK006 * */ public class NodeCompareDialog extends JDialog { /** * serialVersionUID */ private static final long serialVersionUID = 3936042853653899944L; /** * 所属窗口 */ private Window ownerDialog; /** * 行面板宽度 */ private int buttonPanelWidth = 30; /** * 左右比较面板宽度 */ private int paneWeight = 365; /** * 右键菜单 */ private CompareDialogPopupMenu epm = null; /** * 工具条 */ private CompareDialogToolBar etb = null; /** * Comparer对象 */ private Comparer comparer = null; /** * 边框 */ private Border lBorder; /** * 边框 */ private Border rBorder; /** * 主滚动面板 */ private JScrollPane mainScroll; /** * Excel树 */ public JTree lTree; /** * 数据库树 */ public JTree rTree; /** * 中间行号 */ private JList numList; /** * 构造器 * @param ownerDialog 所属窗口 * @param title 窗口标题 * @param data 依赖数据 */ public NodeCompareDialog(Dialog ownerDialog, String title, Comparer comparer){ super(ownerDialog, title, true); this.ownerDialog = ownerDialog; this.epm = new CompareDialogPopupMenu(this); this.etb = new CompareDialogToolBar(this); this.comparer = comparer; lBorder = BorderFactory.createTitledBorder("系统数据"); rBorder = BorderFactory.createTitledBorder("系统数据"); init(); addListener(); this.setLocationRelativeTo(this.ownerDialog); this.setResizable(false); } /** * 构造器 * @param ownerDialog 所属窗口 * @param title 窗口标题 * @param data 依赖数据 */ public NodeCompareDialog(Frame ownerDialog, String title, Comparer comparer){ super(ownerDialog, title, true); this.ownerDialog = ownerDialog; this.epm = new CompareDialogPopupMenu(this); this.etb = new CompareDialogToolBar(this); this.comparer = comparer; lBorder = BorderFactory.createTitledBorder("系统数据"); rBorder = BorderFactory.createTitledBorder("系统数据"); init(); addListener(); this.setLocationRelativeTo(this.ownerDialog); this.setResizable(false); } /** * 绘制 */ public void init() { //创建工具条 JPanel toolBarPanel = etb.createToolBar(lTree, rTree, comparer); //创建树结构比较面板 mainScroll = new JScrollPane(); JPanel mainPanel = new JPanel(); //创建左右区域树 createTrees(); //展开所有节点 expandAll(); //添加树节点事件 addlistener(); //设置面板的大小 int paneHeight = lTree.getRowHeight() * lTree.getRowCount() + 40; //ExcelTree区域 JPanel excelPanel = new JPanel(); JViewport excelViewPort = new JViewport(); excelViewPort.setSize(paneWeight, paneHeight); excelViewPort.setView(lTree); excelPanel.setLayout(new BorderLayout()); excelPanel.add(excelViewPort, BorderLayout.CENTER); excelPanel.setBorder(lBorder); excelPanel.setBounds(new Rectangle(5, 0, paneWeight, paneHeight)); //中间分隔区,显示行号 JPanel buttonPanel = createRowNumPanel(); buttonPanel.setBounds(new Rectangle( paneWeight + 5, 13 ,buttonPanelWidth, paneHeight - 10)); //dsTree区域 JPanel dsPanel = new JPanel(); JViewport dsViewPort = new JViewport(); dsViewPort.setSize(paneWeight, paneHeight); dsViewPort.setView(rTree); dsPanel.setLayout(new BorderLayout()); dsPanel.add(dsViewPort, BorderLayout.CENTER); dsPanel.setBorder(rBorder); dsPanel.setBounds(new Rectangle( paneWeight + buttonPanelWidth + 5, 0, paneWeight, paneHeight)); mainPanel.setPreferredSize(new Dimension( paneWeight * 2 + buttonPanelWidth + 5, paneHeight)); mainPanel.setLayout(null); mainPanel.add(excelPanel); mainPanel.add(buttonPanel); mainPanel.add(dsPanel); mainScroll.setViewportView(mainPanel); //设置滚动条滚动的速度 mainScroll.getVerticalScrollBar().setUnitIncrement(50); //创建一个控制显示的滚动条 JPanel scrollPanel = createScrollBar(lTree, rTree, excelViewPort, dsViewPort); //绑定快捷键,窗口只需要绑定一次 epm.bindHotkeys(mainScroll); this.setSize(800, 600); this.getContentPane().setLayout(new BorderLayout()); this.getContentPane().add(toolBarPanel, BorderLayout.NORTH); this.getContentPane().add(mainScroll, BorderLayout.CENTER); this.getContentPane().add(scrollPanel, BorderLayout.SOUTH); } /** * 创建树结构 */ private void createTrees() { //设置虚根节点 CompareTreeNode lRoot = new CompareTreeNode("LRoot"); CompareTreeNode rRoot = new CompareTreeNode("RRoot"); DefaultTreeModel lDtml = new DefaultTreeModel(lRoot); DefaultTreeModel rDtml = new DefaultTreeModel(rRoot); lTree = new JTree(lDtml); rTree = new JTree(rDtml); //属性设置 lTree.setRootVisible(false); rTree.setRootVisible(false); lTree.setShowsRootHandles(false); rTree.setShowsRootHandles(false); lTree.setCellRenderer(this.comparer.getTreeRenderer()); rTree.setCellRenderer(this.comparer.getTreeRenderer()); lTree.setScrollsOnExpand(true); rTree.setScrollsOnExpand(true); lTree.setToggleClickCount(3); rTree.setToggleClickCount(3); //加载树节点 refreshTrees(lRoot, lDtml, rRoot, rDtml); //设置根节点为选中状态 rTree.setSelectionRow(0); lTree.setSelectionRow(0); } /** * 创建中间行面板 * 创建行号列表并设置选择时间 * @param lTree * @return */ private JPanel createRowNumPanel() { JPanel buttonPanel = new JPanel(); DefaultListModel dlm = new DefaultListModel(); dlm.setSize(lTree.getRowCount()); for(int i = 0; i < dlm.getSize(); i++) { dlm.set(i, i + 1); } numList = new JList(dlm); numList.setBackground(buttonPanel.getBackground()); numList.setFixedCellHeight(lTree.getRowHeight()); numList.setFixedCellWidth(buttonPanelWidth); numList.addListSelectionListener(lsl); //buttonPanel.setBorder(buttonBorder); buttonPanel.add(numList, BorderLayout.CENTER); return buttonPanel; } /** * 创建窗口最下放的滚动条 * @param paneWeight 面板的宽度 * @param buttonPanelWidth 中间分隔面板的宽度 * @param excelTree Excel Tree * @param dsTree Ds Tree * @param excelViewport Excel Tree Viewport * @param dsViewport Ds Tree Viewport * @return */ private JPanel createScrollBar(JTree excelTree, JTree dsTree, final JViewport excelViewport, final JViewport dsViewport) { JPanel scrollBarPanel = new JPanel(); scrollBarPanel.setLayout(null); //创建Excel窗口滚动条 JScrollBar excelBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 1); //获得树的preferred size; Dimension excelPreferredSize = excelTree.getPreferredScrollableViewportSize(); int excelBarMax = excelPreferredSize.width- paneWeight; boolean showLeftBar = false; if(excelBarMax > 0){ showLeftBar = true; } if(showLeftBar) { excelBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, (int)(excelBarMax * (excelBarMax / ((double)paneWeight))), 0, excelBarMax + ((int)(excelBarMax * (excelBarMax / ((double)paneWeight))))); } excelBar.addAdjustmentListener(new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { int value = e.getValue(); excelViewport.setViewPosition(new Point(value, 0)); } }); //创建Ds窗口滚动条 JScrollBar dsBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 1); //获得树的preferred size; Dimension dsPreferredSize = dsTree.getPreferredScrollableViewportSize(); int dsBarMax = dsPreferredSize.width - paneWeight; boolean showRightBar = false; if(dsBarMax > 0){ showRightBar = true; } if(showRightBar) { dsBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, (int)(dsBarMax * (dsBarMax / ((double)paneWeight))), 0, dsBarMax + ((int)(dsBarMax * (dsBarMax / ((double)paneWeight))))); } dsBar.addAdjustmentListener(new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { int value = e.getValue(); dsViewport.setViewPosition(new Point(value, 0)); } }); scrollBarPanel.setPreferredSize(new Dimension(2 * paneWeight + buttonPanelWidth + 5, excelBar.getPreferredSize().height)); excelBar.setBounds(new Rectangle(5, 0, paneWeight, excelBar.getPreferredSize().height)); dsBar.setBounds(new Rectangle(paneWeight + buttonPanelWidth + 5, 0, paneWeight, dsBar.getPreferredSize().height)); scrollBarPanel.add(excelBar); scrollBarPanel.add(dsBar); return scrollBarPanel; } /** * 为树添加事件 */ private void addlistener() { //excelTree选择事件 this.lTree.addTreeSelectionListener(etl); //excelTree展开事件 this.lTree.addTreeExpansionListener(new TreeExpansionListener() { @Override public void treeExpanded(TreeExpansionEvent event) { TreePath tp = event.getPath(); lTree.setSelectionPath(tp); if(tp.getParentPath() == null) { TreePath rTp = new TreePath(( (DefaultMutableTreeNode)rTree.getModel().getRoot()).getPath()); rTree.expandPath(rTp); } else { int[] rows = lTree.getSelectionRows(); rTree.expandRow(rows[0]); } } @Override public void treeCollapsed(TreeExpansionEvent event) { TreePath tp = event.getPath(); lTree.setSelectionPath(tp); if(tp.getParentPath() == null) { TreePath rTp = new TreePath(( (DefaultMutableTreeNode)rTree.getModel().getRoot()).getPath()); rTree.collapsePath(rTp); } else { int[] rows = lTree.getSelectionRows(); rTree.collapseRow(rows[0]); } } }); //点击事件 this.lTree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { //设置单击节点为选中状态 int clickCount = e.getClickCount(); int x = e.getX(); int y = e.getY(); // TreePath tp = lTree.getPathForLocation(x, y); //如果是右键 if(e.getButton() == MouseEvent.BUTTON3) { if(tp != null) { lTree.setSelectionPath(tp); epm.show(lTree, x, y); } } else if(clickCount == 2 && e.getButton() == MouseEvent.BUTTON1) { if(tp != null) { doubleClickAction(); } } } }); //dsTree选择事件 this.rTree.addTreeSelectionListener(dtl); //dsTree展开事件 this.rTree.addTreeExpansionListener(new TreeExpansionListener() { @Override public void treeExpanded(TreeExpansionEvent event) { TreePath tp = event.getPath(); rTree.setSelectionPath(tp); if(tp.getParentPath() == null) { TreePath lTp = new TreePath(( (DefaultMutableTreeNode) lTree.getModel().getRoot()).getPath()); lTree.expandPath(lTp); } else { int[] rows = rTree.getSelectionRows(); lTree.expandRow(rows[0]); } } @Override public void treeCollapsed(TreeExpansionEvent event) { TreePath tp = event.getPath(); rTree.setSelectionPath(tp); if(tp.getParentPath() == null) { TreePath lTp = new TreePath(( (DefaultMutableTreeNode) lTree.getModel().getRoot()).getPath()); lTree.collapsePath(lTp); } else { int[] rows = rTree.getSelectionRows(); lTree.collapseRow(rows[0]); } } }); //点击事件 this.rTree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { //设置单击节点为选中状态 int clickCount = e.getClickCount(); int x = e.getX(); int y = e.getY(); // TreePath tp = rTree.getPathForLocation(x, y); //如果是右键 if(e.getButton() == MouseEvent.BUTTON3) { if(tp != null) { rTree.setSelectionPath(tp); epm.show(rTree, x, y); } } else if(clickCount == 2 && e.getButton() == MouseEvent.BUTTON1) { if(tp != null) { doubleClickAction(); } } } }); } /** * 列表选择事件 */ private ListSelectionListener lsl = new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { int[] rows = numList.getSelectedIndices(); if(rows != null && rows.length > 0) { //判断选择事件是不是需要被触发 lTree.setSelectionRows(rows); rTree.setSelectionRows(rows); } } }; /** * excelTree选择事件 */ private TreeSelectionListener etl = new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { int[] rows = lTree.getSelectionRows(); if(rows != null && rows.length > 0) { rTree.setSelectionRows(rows); numList.removeListSelectionListener(lsl); numList.setSelectedIndices(rows); numList.addListSelectionListener(lsl); } } }; /** * dsTree 的选择事件 */ private TreeSelectionListener dtl = new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { int[] rows = rTree.getSelectionRows(); if(rows != null && rows.length > 0) { lTree.setSelectionRows(rows); numList.removeListSelectionListener(lsl); numList.setSelectedIndices(rows); numList.addListSelectionListener(lsl); } } }; /** * 添加窗口事件 */ private void addListener() { /** * 属性变更事件 * 用于控制菜单的状态的变更 */ this.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { windowPropertyChange(evt); } }); /** * 窗口关闭事件 */ this.addWindowListener(new WindowAdapter() { private int oldValue; @SuppressWarnings("unused") @Override public void windowClosing(WindowEvent paramWindowEvent) { if(!true) { if(getDefaultCloseOperation() != WindowConstants.DO_NOTHING_ON_CLOSE) { oldValue = getDefaultCloseOperation(); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); } } else { if(getDefaultCloseOperation() == WindowConstants.DO_NOTHING_ON_CLOSE && oldValue != WindowConstants.DO_NOTHING_ON_CLOSE) { setDefaultCloseOperation(oldValue); } } } }); } /** * 属性变更事件 * 用于控制菜单的状态的变更 * @param evt */ public void windowPropertyChange(PropertyChangeEvent evt) { this.etb.btnPropertyChangeEvent(evt); } /** * TODO 树节点排序 * @param order 排序方式 >0升序 <0降序 * @return */ public void sort(int order) { //try { // ea.sort(lTree, rTree, order); //} catch (Exception e) { // e.printStackTrace(); // VCIOptionPane.showMessage(this, e.getMessage()); //} } /** * TODO 忽略节点差异 */ public void ignored() { //ea.ignored(lTree, rTree); } /** * TODO 更新link关系 */ public void updateLink() { //ea.updateLink(lTree, rTree); } /** * TODO 单条更新事件 */ public void updateRightSingle() { //ea.updateRightSingle(lTree, rTree); } /** * TODO 批量更新 */ public void updateRigthBatch() { //ea.updateRightBatch(lTree, rTree); } /** * TODO 解除关系按钮 */ public void deleteAction() { //ea.deleteAction(lTree, rTree); } /** * TODO 保存 */ public void save() { //ea.save(); } /** * 展开所有 */ public void expandAll() { for(int i = 0; i < lTree.getRowCount(); i++) { lTree.expandRow(i); rTree.expandRow(i); } } /** * 折叠所有 */ public void collapseAll() { DefaultMutableTreeNode lRoot = (DefaultMutableTreeNode) lTree.getModel().getRoot(); collapseAllChildren(lTree, lRoot); lTree.collapseRow(0); } /** * TODO 导出差异信息 */ public void exportDifferences() { //ea.exportDifferences(lTree, rTree); } /** * TODO 复制当前选中节点的数据到剪切板 */ public void debugCopyNodeData() { //ea.debugCopyNodeData(lTree, rTree); } /** * 节点双击事件 */ public void doubleClickAction() { TreeNodeObject lTno = null; TreeNodeObject rTno = null; //获得左侧节点 TreePath etp = this.lTree.getSelectionPath(); DefaultMutableTreeNode lNode = (DefaultMutableTreeNode) etp.getLastPathComponent(); lTno = (TreeNodeObject) lNode.getUserObject(); //获得右侧节点 TreePath dtp = this.rTree.getSelectionPath(); DefaultMutableTreeNode rNode = (DefaultMutableTreeNode) dtp.getLastPathComponent(); rTno = (TreeNodeObject) rNode.getUserObject(); //实现了属性查看、编辑功能 //对于忽略的节点不能再编辑器中进行编辑 NodeAttributeCompareDialog nacd = new NodeAttributeCompareDialog(this, lTno, rTno); lTree.updateUI(); rTree.updateUI(); } /** * 选择树节点并设置显示在视图窗口中 * @param lTree excel树 * @param rTree ds树 * @param row 选择的行 */ public void selectTreeNode(int row) { lTree.setSelectionRow(row); int height = lTree.getRowHeight() * row; Rectangle r = mainScroll.getViewport().getViewRect(); int topHeight = r.y; int bottomHeight = r.y + r.height; if(height < topHeight) { mainScroll.getViewport().setViewPosition(new Point(0, height)); } else if(height + 40 > bottomHeight) { //mainScroll.getViewport().setViewPosition(new Point(0, height - r.height)); mainScroll.getViewport().setViewPosition(new Point(0, r.y + height + 40 - bottomHeight)); } } /** * 折叠所有子节点 * @param node */ private void collapseAllChildren(JTree tree, DefaultMutableTreeNode node) { int childCount = node.getChildCount(); if(childCount > 0) { for(int i = 0; i < childCount; i++) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); collapseAllChildren(tree, child); tree.collapsePath(new TreePath(child.getPath())); } } } /** * 更新树节点 * @param g * @param vertexMap * @param lNode 左侧树节点 * @param lDtml 左侧的树模型 * @param rNode 右侧树节点 * @param rDtml 右侧的树模型 * @param edppp 窗口参数 * @param lNodeMap 所有左侧节集合 * @param lBaseNodeMap 所有左侧节点集合 * @param rNodeMap 所有右侧节集合 * @param rBaseNodeMap 所有右侧节点集合 */ @SuppressWarnings("unchecked") public void refreshTrees(CompareTreeNode lNode, DefaultTreeModel lDtml, CompareTreeNode rNode, DefaultTreeModel rDtml) { //清除节点 lNode.removeAllChildren(); rNode.removeAllChildren(); //判断parentNode是否是虚根 String className = lNode.getUserObject().getClass().getName(); if(className.equals("java.lang.String")) { //判断是否有根节点 Map lRoots = this.comparer.getlDataLoader().getRoots(); Map rRoots = this.comparer.getrDataLoader().getRoots(); refreshImaginaryRoot(lNode, lDtml, rNode, rDtml, lRoots, rRoots); } else { //添加子节点 TreeNodeObject lParent = (TreeNodeObject) lNode.getUserObject(); TreeNodeObject rParent = (TreeNodeObject) rNode.getUserObject(); // Map lObjectMap = this.comparer.getlDataLoader().getChildren(lParent.getMainObjectKey(), lParent); Map rObjectMap = this.comparer.getrDataLoader().getChildren(rParent.getMainObjectKey(), rParent); TreeSet keySet = new TreeSet(); keySet.addAll(lObjectMap.keySet()); keySet.addAll(rObjectMap.keySet()); for(String key : keySet) { Object lObject = lObjectMap.get(key); Object rObject = rObjectMap.get(key); Object lRelation = this.comparer.getlDataLoader().getChildLink(lParent.getMainObjectKey(), lParent, lObject); Object rRelation = this.comparer.getrDataLoader().getChildLink(rParent.getMainObjectKey(), rParent, rObject); TreeNodeObject lTno = this.comparer.getLTreeNodeObjectFactory().getTreeNodeObject(lParent, lRelation, lObject, false); TreeNodeObject rTno = this.comparer.getRTreeNodeObjectFactory().getTreeNodeObject(rParent, rRelation, rObject, false); //设置对照关系 lTno.setRelativeTreeNodeObject(rTno); rTno.setRelativeTreeNodeObject(lTno); //设置父节点对象的子对象 lParent.setChildNodeList(lTno); rParent.setChildNodeList(rTno); //设置节点对象状态 if(this.comparer.getComparer() != null) { this.comparer.getComparer().compare(this.comparer.getAttributes(), lTno, rTno); } //添加树节点 CompareTreeNode lCtn = new CompareTreeNode(getShowName(lTno, 0, rTno), lTno); CompareTreeNode rCtn = new CompareTreeNode(getShowName(rTno, 1, lTno), rTno); lNode.insert(lCtn, lNode.getChildCount()); rNode.insert(rCtn, rNode.getChildCount()); refreshTrees(lCtn, lDtml, rCtn, rDtml); } } //判断是否有根节点 lDtml.reload(lNode); rDtml.reload(rNode); } /** * 创建根节点 * @param lNode 左侧节点 * @param lDtml 左侧树模型 * @param rNode 右侧节点 * @param rDtml 右侧树模型 * @param lRoots 虚根 * @param rRoots 虚根 */ private void refreshImaginaryRoot( DefaultMutableTreeNode lNode, DefaultTreeModel lDtml, DefaultMutableTreeNode rNode, DefaultTreeModel rDtml, Map lRoots, Map rRoots) { TreeSet keySet = new TreeSet(); keySet.addAll(lRoots.keySet()); keySet.addAll(rRoots.keySet()); for(String key : keySet) { Object lObject = lRoots.get(key); Object rObject = rRoots.get(key); TreeNodeObject lTno = this.comparer.getLTreeNodeObjectFactory().getTreeNodeObject(null, null, lObject, true); TreeNodeObject rTno = this.comparer.getRTreeNodeObjectFactory().getTreeNodeObject(null, null, rObject, true); lTno.setRelativeTreeNodeObject(rTno); rTno.setRelativeTreeNodeObject(lTno); CompareTreeNode lCtn = new CompareTreeNode(getShowName(lTno, 0, rTno), lTno); CompareTreeNode rCtn = new CompareTreeNode(getShowName(rTno, 1, lTno), rTno); lNode.insert(lCtn, lNode.getChildCount()); rNode.insert(rCtn, rNode.getChildCount()); refreshTrees(lCtn, lDtml, rCtn, rDtml); } } /** * 得到节点显示名称 * * @param tno 节点对象 * @param place 位置 0左侧 1右侧 * @return */ private String getShowName(TreeNodeObject tno, int place, TreeNodeObject relationObject) { if(tno.getCompareState() == CompareState.ISNULL) { if(relationObject == null) { return null; } else { return getShowName(relationObject, place == 0 ? 1 : 0, null); } } List attdefList = this.comparer.getAttributes().getNodeDisplayAttrs(); if(attdefList == null || attdefList.isEmpty()) { return null; } StringBuffer sb = new StringBuffer(); for(Attdef ad : attdefList) { String key = ""; boolean isRelation = false; if(place == 0) { key = ad.getlNodeObjectAttr(); isRelation = ad.islIsRelationAttr(); } else { key = ad.getrNodeObjectAttr(); isRelation = ad.isrIsRelationAttr(); } String value = tno.getAttribute(key, isRelation ? TreeNodeObject.RELATIONOBJECT : TreeNodeObject.MAINOBJECT); Object object = this.getComparer().getAttributes().convert(ad, value); value = object == null ? "" : object.toString(); if(sb.length() < 1) { sb.append(value); } else { sb.append(" ").append(value); } } return sb.toString(); } /** * 得到Comparer * @return */ public Comparer getComparer() { return this.comparer; } }