JTreeTable
//其中大部分是多余代码 没有整理 有需要自己慢慢找
package com.bestway.bcus.client.checkstock; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.EventObject; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Vector; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JToolBar; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.TableCellRenderer; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.util.JRLoader; import org.apache.commons.io.FileUtils; import com.bestway.bcus.client.checkcancel.DgCancelOwner; import com.bestway.bcus.client.checkstock.jtreeTable.*; import com.bestway.bcus.checkcancel.action.CheckCancelAction; import com.bestway.bcus.checkcancel.entity.CancelOwnerHead; import com.bestway.bcus.checkstock.action.ECSCheckStockAction; import com.bestway.bcus.checkstock.action.ECSCheckStockAuthority; import com.bestway.bcus.checkstock.entity.ECSAttachmentManagement; import com.bestway.bcus.checkstock.entity.ECSSection; import com.bestway.bcus.client.common.CommonDataSource; import com.bestway.bcus.client.common.CommonProgress; import com.bestway.bcus.client.common.CommonVars; import com.bestway.bcus.client.common.DgReportViewer; import com.bestway.bcus.system.entity.Company; import com.bestway.client.util.JTableListModel; import com.bestway.client.util.JTableListModelAdapter; import com.bestway.common.Request; import com.bestway.ui.winuicontrol.JInternalFrameBase; import javax.swing.JSplitPane; /** * @author lyh * * // change the template for this generated type comment go to Window - * Preferences - Java - Code Style - Code Templates */ @SuppressWarnings({ "serial", "rawtypes", "unchecked" }) public class FmECSAttachment extends JInternalFrameBase { private javax.swing.JPanel jContentPane = null; private JTableListModel tableModel = null; private ECSCheckStockAction ecsCheckStockAction = null; private JPanel panel; private JToolBar toolBar; private JScrollPane scrollPane; private JTable table; private JButton btnUpLoad; private JButton btnDown; private Request request; private JScrollPane scrollPane_1; private JButton btnAdd; private JButton btnAddParent; private JButton btnAddChild; private JButton btnHidden; private JButton btnReportPreview; private JSplitPane splitPane_1; private JTreeTable treeTable; private JButton btnEdit; private JButton btnSaveData; private JButton btnDelette; private JPanel panel_1; private JToolBar toolBar_1; private JButton btnDeleteSection; private JButton btnExportExcel; AttachmentTableModel treeModel; List treeColumnName = new ArrayList(); private CheckCancelAction checkCancelAction = null; /** * This is the default constructor */ public FmECSAttachment() { super(); request = new Request(CommonVars.getCurrUser()); ecsCheckStockAction = (ECSCheckStockAction) CommonVars .getApplicationContext().getBean("ecsCheckStockAction"); ECSCheckStockAuthority authority = (ECSCheckStockAuthority) CommonVars .getApplicationContext().getBean("ecsCheckStockAuthority"); authority.checkAnalyse(request); checkCancelAction = (CheckCancelAction) CommonVars .getApplicationContext().getBean("checkCancelAction"); initialize(); } /** * This method initializes this * * @return void */ private void initialize() { this.setSize(1088, 566); this.setContentPane(getJContentPane()); this.setTitle("核查资料附件管理"); List list = ecsCheckStockAction.findAttachmentSection(request, true); if (list == null) { list = new ArrayList(); } treeColumnName.add("项目内容"); treeColumnName.add("资料内容"); treeColumnName.add("提供单位"); treeColumnName.add("资料类型"); treeColumnName.add("资料提供要求"); treeColumnName.add("是否用印"); treeColumnName.add("资料签名/手印"); treeColumnName.add("附件名"); treeColumnName.add(""); treeColumnName.add("创建时间"); treeColumnName.add("创建人"); treeColumnName.add("修改时间"); treeColumnName.add("修改人"); treeColumnName.add("是否隐藏"); initTable(list); initTreeTable(); } public JTreeTable getTreeTable() { if (treeTable == null) { treeModel = new AttachmentTableModel(treeColumnName, new ArrayList()); treeTable = new JTreeTable(treeModel); treeTable.setTextProperty("projectContent"); } return treeTable; } // /////////////// class ButtonEditor extends DefaultCellEditor { protected JButton button; private String label; private boolean isPushed; public ButtonEditor(JTextField checkBox) { super(checkBox); this.setClickCountToStart(1); button = new JButton(); button.setOpaque(true); button.setPreferredSize(new Dimension(20, 16)); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fireEditingStopped(); ECSAttachmentManagement attachment = getDataByRow(); if (attachment != null) { if (ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD.equals(attachment.getControlsState())) { Object[] options ={ "上传文件", "下载文件!","取消选择"}; int m = JOptionPane.showOptionDialog(null, "请选择!", "标题",JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if(m==0){ // 上传文件 upLoad(attachment); initTreeTable(); }else if(m==1){ // 下载文件 download(attachment); } return; } else if (ECSAttachmentManagement.EXPORP_EXCEL.equals(attachment.getControlsState())) { File file = getSelectFile(attachment.getProjectContent() + ".xls"); AttachmentExportExcel exportExecl = new AttachmentExportExcel( attachment, file); exportExecl.exportExcel(); } else if (ECSAttachmentManagement.PRINT.equals(attachment.getControlsState())) { print(attachment); } }else{ JOptionPane.showMessageDialog(FmECSAttachment.this, "当前行信息为空!"); } } }); } public Component getTableCellEditorComponent(final JTable table, Object value, boolean isSelected, int row, int column) { if (isSelected) { button.setForeground(table.getSelectionForeground()); button.setBackground(table.getSelectionBackground()); } else { button.setForeground(table.getForeground()); button.setBackground(table.getBackground()); } // label = (value == null) ? "" : value.toString(); if (value != null) { if (ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD.equals(value .toString())) { label = "上传/下载"; } else if (ECSAttachmentManagement.EXPORP_EXCEL.equals(value .toString())) { label = "导出Excel"; } else if (ECSAttachmentManagement.PRINT.equals(value .toString())) { label = "打印报表"; } } isPushed = true; if (value == null) { return null; } return button; } public Object getCellEditorValue() { isPushed = false; return new String(label); } public boolean stopCellEditing() { isPushed = false; return super.stopCellEditing(); } @Override public boolean shouldSelectCell(EventObject anEvent) { return super.shouldSelectCell(anEvent); } } class ButtonRenderer extends JButton implements TableCellRenderer { public ButtonRenderer() { setOpaque(true); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(UIManager.getColor("UIManager")); } // setText((value == null) ? "" : value.toString()); if (value == null) { return null; } else { if (ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD.equals(value .toString())) { setText("上传/下载"); } else if (ECSAttachmentManagement.EXPORP_EXCEL.equals(value .toString())) { setText("导出Excel"); } else if (ECSAttachmentManagement.PRINT.equals(value .toString())) { setText("打印报表"); } } return this; } } // /////////////// /** * * @param jTable * @param list * @return */ private void initTable(List list) { tableModel = new JTableListModel(table, list, new JTableListModelAdapter() { public List InitColumns() { List list = new ArrayList(); list.add(addColumn("报核次数", "cancelOwnerHead.cancelTimes", 80)); list.add(addColumn("批次号", "verificationNo", 60)); list.add(addColumn("盘点开始日期", "beginDate", 120)); list.add(addColumn("盘点结束日期", "endDate", 120)); list.add(addColumn("报核开始日期", "cancelOwnerHead.beginDate", 120)); list.add(addColumn("报核结束日期", "cancelOwnerHead.endDate", 120)); return list; } }); } /** * This method initializes jContentPane * * @return javax.swing.JPanel */ private javax.swing.JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new javax.swing.JPanel(); jContentPane.setLayout(new java.awt.BorderLayout()); jContentPane.add(getSplitPane_1(), BorderLayout.CENTER); } return jContentPane; } /** * @return Returns the tableModel. */ public JTableListModel getTableModel() { return tableModel; } /** * @param tableModel * The tableModel to set. */ public void setTableModel(JTableListModel tableModel) { this.tableModel = tableModel; } /** * * @return */ private JPanel getPanel() { if (panel == null) { panel = new JPanel(); panel.setLayout(new BorderLayout(0, 0)); panel.add(getToolBar(), BorderLayout.NORTH); panel.add(getScrollPane(), BorderLayout.CENTER); } return panel; } /** * * @return */ private JToolBar getToolBar() { if (toolBar == null) { toolBar = new JToolBar(); toolBar.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 0)); toolBar.add(getBtnAddParent()); toolBar.add(getBtnAddChild()); toolBar.add(getBtnEdit()); toolBar.add(getBtnSaveData()); toolBar.add(getBtnDelette()); toolBar.add(getBtnHidden()); // toolBar.add(getBtnUpLoad()); // toolBar.add(getBtnDown()); // toolBar.add(getBtnReportPreview()); // toolBar.add(getBtnExportExcel()); } return toolBar; } /** * * @return */ private JButton getBtnUpLoad() { if (btnUpLoad == null) { btnUpLoad = new JButton("上传附件"); btnUpLoad.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 上传文件 // upLoad(); initTreeTable(); } }); } return btnUpLoad; } // // 上传文件 // class upLoadFileDataRunnable implements Runnable { // public void run() { // } // } public void upLoad(ECSAttachmentManagement attachment){ if (attachment == null) { JOptionPane.showMessageDialog(FmECSAttachment.this, "请选择一行!"); } System.out.println(attachment.getAttachmentName()); if (attachment.getAttachmentName() != null && !attachment.getAttachmentName().trim().isEmpty()) { if (JOptionPane.YES_NO_OPTION != JOptionPane.showOptionDialog( getParent(), "确定覆盖上传文档吗?", "提示", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] { "是(Y)", "否(N)" }, "否(N)")) { return; } } JFileChooser fileChooser = new JFileChooser(); fileChooser.removeChoosableFileFilter(fileChooser .getFileFilter()); // fileChooser.setFileFilter(new CommonFileFilter( // new String[] { "*" }, "选择文件")); int state = fileChooser.showOpenDialog(FmECSAttachment.this); if (state != JFileChooser.APPROVE_OPTION) { return; } File attachmentFile = fileChooser.getSelectedFile(); if (attachmentFile == null || !attachmentFile.exists()) { return; } upLoadFileData(attachmentFile, attachment); initTreeTable(); } public void upLoadFileData(File attachmentFile, ECSAttachmentManagement attachmentManagement) { try { // CommonProgress.showProgressDialog(FmECSAttachment.this); // CommonProgress.setMessage("系统正在上传文件资料,请稍后..."); ZipUtil zip = new ZipUtil(); if (attachmentFile == null) { JOptionPane.showMessageDialog(FmECSAttachment.this, "清先选择文件"); } String fileName = attachmentFile.getName(); if (fileName.indexOf(".") >= 0) { fileName = fileName.substring(0, fileName.lastIndexOf(".")); } String newFile = attachmentFile.getParentFile() + "\\" + fileName + ".zip"; zip.zip(newFile, attachmentFile); byte[] fileEntity = zip.fileToBytes(newFile);// 将文件转成byte[] ECSAttachmentManagement attachment = attachmentManagement; attachment.setAttachmentName(attachmentFile.getName());// 文件名称 attachment.setCreateDate(new Date()); attachment.setCreatePeople(CommonVars.getCurrUser().getUserName()); ecsCheckStockAction.updateAttachment( new Request(CommonVars.getCurrUser()), attachment); ecsCheckStockAction.upLoadAttachment( new Request(CommonVars.getCurrUser()), fileEntity, fileName + attachment.getId() + ".zip"); new File(newFile).delete(); // CommonProgress.closeProgressDialog(); } catch (Exception e) { e.printStackTrace(); } finally { // CommonProgress.closeProgressDialog(); } } private JButton getBtnDown() { if (btnDown == null) { btnDown = new JButton("下载附件"); btnDown.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ECSAttachmentManagement attachment = getDataByRow(); if (attachment != null) { // 下载文件 // download(); } else { JOptionPane.showMessageDialog(FmECSAttachment.this, "请选择要下载的文件!"); return; } } }); } return btnDown; } /** * * @return */ private JScrollPane getScrollPane() { if (scrollPane == null) { scrollPane = new JScrollPane(); scrollPane.setViewportView(getTreeTable()); // scrollPane // .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); // scrollPane // .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); } return scrollPane; } public void initTreeTable() { if (tableModel == null) { return; } ECSSection section = (ECSSection) tableModel.getCurrentRow(); List listData = ecsCheckStockAction.findECSAttachmentManagement( new Request(CommonVars.getCurrUser()), section); if (listData == null) { listData = new ArrayList(); } treeModel = new AttachmentTableModel(treeColumnName, listData); treeTable.setModel(treeModel); setColumnWidth(treeTable); treeTable.getSelectionModel().addListSelectionListener( new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { ECSAttachmentManagement attachment = getDataByRow(); if (attachment!=null&&attachment.getIsHidden() != null && attachment.getIsHidden() == true) { btnHidden.setText("显示"); } else { btnHidden.setText("隐藏"); } setButtonStatus(attachment); } } }); scrollPane.setViewportView(treeTable); btnEdit.setEnabled(true); treeTable.getColumnModel().getColumn(8) .setCellRenderer(new ButtonRenderer()); treeTable.getColumnModel().getColumn(8) .setCellEditor(new ButtonEditor(new JTextField())); } private void setButtonStatus(ECSAttachmentManagement att) { if (att == null) { btnAddChild.setEnabled(false); btnHidden.setEnabled(false); // btnDown.setEnabled(false); // btnUpLoad.setEnabled(false); // btnReportPreview.setEnabled(false); // btnExportExcel.setEnabled(false); } else { btnAddChild.setEnabled(isStringEmpty(att.getParentId())); btnHidden.setEnabled(isStringEmpty(att.getParentId())); // btnDown.setEnabled(ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD // .equals(att.getControlsState())); // btnUpLoad.setEnabled(ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD // .equals(att.getControlsState())); // btnReportPreview.setEnabled(ECSAttachmentManagement.PRINT // .equals(att.getControlsState())); // btnExportExcel.setEnabled(ECSAttachmentManagement.EXPORP_EXCEL // .equals(att.getControlsState())); } } private boolean isStringEmpty(String s) { return s == null || s.isEmpty(); } public void setColumnWidth(JTreeTable treeTable) { treeTable.getColumnModel().getColumn(0).setPreferredWidth(240); treeTable.getColumnModel().getColumn(1).setPreferredWidth(100); treeTable.getColumnModel().getColumn(2).setPreferredWidth(100); treeTable.getColumnModel().getColumn(3).setPreferredWidth(130); treeTable.getColumnModel().getColumn(4).setPreferredWidth(80); treeTable.getColumnModel().getColumn(5).setPreferredWidth(125); treeTable.getColumnModel().getColumn(6).setPreferredWidth(80); treeTable.getColumnModel().getColumn(7).setPreferredWidth(150); treeTable.getColumnModel().getColumn(8).setPreferredWidth(100); treeTable.getColumnModel().getColumn(9).setPreferredWidth(70); treeTable.getColumnModel().getColumn(10).setPreferredWidth(70); treeTable.getColumnModel().getColumn(11).setPreferredWidth(50); treeTable.getColumnModel().getColumn(12).setPreferredWidth(50); treeTable.getColumnModel().getColumn(12).setPreferredWidth(50); } // // 下载文件 // class DownLoadFileDataRunnable implements Runnable { // public void run() { // } // } public void download(ECSAttachmentManagement attachment){ if (attachment == null) { return; } String fileName = attachment.getAttachmentName() == null ? null : attachment.getAttachmentName(); if (fileName == null || fileName.trim().equals("")) { return; } JFileChooser fileChooser = new JFileChooser("./"); fileChooser.setDialogTitle("请选择文件的存放路径!"); String extensions = getFileExtension(fileName); if (extensions != null) { fileChooser.addChoosableFileFilter(new FileNameExtensionFilter( extensions, extensions)); } // fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);// fileChooser.setSelectedFile(new File(fileName)); int state = fileChooser.showDialog(FmECSAttachment.this, "保存"); File file = null; if (state == JFileChooser.APPROVE_OPTION) { file = fileChooser.getSelectedFile(); } else { return; } if (attachment.getId() != null) { downLoadFileData(file, attachment.getId(), fileName); } } /** * 下载文件 * * @param depositFile * 存放路径 * @param fileId * @param fileName */ public void downLoadFileData(File depositFile, String fileId, String fileName) { try { if (depositFile == null) { JOptionPane.showMessageDialog(FmECSAttachment.this, "选择的文件存放地址为空,无法保存!"); return; } if (fileId != null) { CommonProgress.showProgressDialog(FmECSAttachment.this); CommonProgress.setMessage("系统正在下载文件资料,请稍后..."); if (fileName.indexOf(".") >= 0) { fileName = fileName.substring(0, fileName.lastIndexOf(".")); } // 下载服务器端的文件 文件名加id byte[] fileContent = ecsCheckStockAction.downLoadAttachment( new Request(CommonVars.getCurrUser()), fileName + fileId + ".zip"); if (fileContent == null) { JOptionPane.showMessageDialog(FmECSAttachment.this, "请确认该文件在服务器存在!"); return; } // 将文件写入到选择的目录中 File zipFile = new File(depositFile.getAbsoluteFile() .getParent() + "\\" + fileName + ".zip"); FileUtils.writeByteArrayToFile(zipFile, fileContent); ZipUtil zip = new ZipUtil(); // 解压文件 zip.unzip(zipFile.getAbsolutePath(), depositFile.getAbsolutePath()); zipFile.delete(); } else { JOptionPane.showMessageDialog(FmECSAttachment.this, "选择下载的文件id为空!"); return; } CommonProgress.closeProgressDialog(); } catch (Exception e) { e.printStackTrace(); } finally { CommonProgress.closeProgressDialog(); } } private String getFileExtension(String fileName) { int index = fileName.lastIndexOf("."); if (index >= 0 && fileName.length() > index + 2) { return fileName.substring(index + 1); } return null; } private JScrollPane getScrollPane_1() { if (scrollPane_1 == null) { scrollPane_1 = new JScrollPane(); scrollPane_1.setViewportView(getTable()); } return scrollPane_1; } private JTable getTable() { if (table == null) { table = new JTable(); table.getSelectionModel().addListSelectionListener( new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { // if (e.getValueIsAdjusting()) { // } initTreeTable(); setButtonStatus(null); } }); } return table; } private JButton getBtnAdd() { if (btnAdd == null) { btnAdd = new JButton("新增"); btnAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DgAttachmentSectionSel addSection = new DgAttachmentSectionSel(); addSection.setVisible(true); if (addSection.isOk()) { tableModel.addRow(addSection.getSection()); } initTreeTable(); } }); } return btnAdd; } private JButton getBtnAddParent() { if (btnAddParent == null) { btnAddParent = new JButton("新增大纲"); btnAddParent.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ECSAttachmentManagement attahment = new ECSAttachmentManagement(); ECSSection ecssection = (ECSSection) tableModel .getCurrentRow(); attahment.setProjectContent("请输入大纲名称"); attahment.setEcssection(ecssection); attahment.setIsTemplate(false); ecsCheckStockAction.saveECSAttachment(request, attahment); initTreeTable(); } }); } return btnAddParent; } private JButton getBtnAddChild() { if (btnAddChild == null) { btnAddChild = new JButton("新增内容"); btnAddChild.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ECSAttachmentManagement patentAttahment = getDataByRow(); if (patentAttahment == null) { return; } if (patentAttahment.getParentId() == null) { ECSAttachmentManagement childAttahment = new ECSAttachmentManagement(); ECSSection ecssection = (ECSSection) tableModel .getCurrentRow(); childAttahment.setEcssection(ecssection); childAttahment.setCreateDate(new Date()); childAttahment.setControlsState("0"); childAttahment.setParentId(patentAttahment.getId()); childAttahment.setIsTemplate(false); childAttahment.setProjectContent("请输入大纲内容"); ecsCheckStockAction.saveECSAttachment(request, childAttahment); initTreeTable(); } } }); } return btnAddChild; } private JButton getBtnHidden() { if (btnHidden == null) { btnHidden = new JButton("隐藏"); btnHidden.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ECSAttachmentManagement attachment = getDataByRow(); if (attachment == null) { return; } attachment.setIsHidden(!Boolean.TRUE.equals(attachment .getIsHidden())); ecsCheckStockAction.saveECSAttachment(request, attachment); initTreeTable(); } }); } return btnHidden; } private JButton getBtnReportPreview() { if (btnReportPreview == null) { btnReportPreview = new JButton("报表预览"); btnReportPreview.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); } return btnReportPreview; } public void print(ECSAttachmentManagement attachment){ ECSSection section = (ECSSection) tableModel .getCurrentRow(); if (section == null) { return; } if (attachment == null) { return; } if (ECSAttachmentManagement.PRINT_BEGINDELCARE .equals(attachment.getOperateState())) { // 打印预报核 printReport(true, section.getCancelOwnerHead()); } else if (ECSAttachmentManagement.PRINT_DELCARE .equals(attachment.getOperateState())) { // 打印正式报核 printReport(false, section.getCancelOwnerHead()); } else if (ECSAttachmentManagement.PRINT_DELCARE_ONE .equals(attachment.getOperateState())) { // 打印正式报核前一次 String cancelTimes = String.valueOf((Integer .parseInt(section.getCancelOwnerHead() .getCancelTimes()) - 1)); CancelOwnerHead cancelOwnerHead = ecsCheckStockAction .findCancelOwnerHead(request, cancelTimes); printReport(false, cancelOwnerHead); } else if (ECSAttachmentManagement.PRINT_DELCARE_TWO .equals(attachment.getOperateState())) { // 打印正式报核前两次 String cancelTimes = String.valueOf((Integer .parseInt(section.getCancelOwnerHead() .getCancelTimes()) - 2)); CancelOwnerHead cancelOwnerHead = ecsCheckStockAction .findCancelOwnerHead(request, cancelTimes); printReport(false, cancelOwnerHead); } } /** * 打印 * * @param boo * 为true打印预报核 false 正式报核 * @param cancelHead */ public void printReport(boolean boo, CancelOwnerHead cancelHead) { if (boo) {// 预报核 List list = checkCancelAction.getCustomsIEToTemp(new Request( CommonVars.getCurrUser()), cancelHead, true); if (list == null && list.size() < 0) { JOptionPane.showMessageDialog(FmECSAttachment.this, "没有可打印的记录!", "提示", 2); return; } Company company = (Company) CommonVars.getCurrUser().getCompany(); CommonDataSource imgExgDS = new CommonDataSource(list); List headlist = new Vector(); // 只有一条记录 headlist.add(cancelHead); CommonDataSource companyDS = new CommonDataSource(headlist); InputStream masterReportStream = DgCancelOwner.class .getResourceAsStream("report/cancelYReport.jasper"); InputStream detailReportStream = DgCancelOwner.class .getResourceAsStream("report/cancelYReportSub.jasper"); try { JasperReport detailReport = (JasperReport) JRLoader .loadObject(detailReportStream); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("name", company.getName()); parameters.put("code", company.getCode()); parameters.put("imgExgDS", imgExgDS);// 子数据源 parameters.put("detailReport", detailReport);// 子报表 JasperPrint jasperPrint; jasperPrint = JasperFillManager.fillReport(masterReportStream, parameters, companyDS); DgReportViewer viewer = new DgReportViewer(jasperPrint); viewer.setVisible(true); } catch (JRException e1) { e1.printStackTrace(); } } else {// 正式报核 List imgExgs = checkCancelAction.findCancelImgResult(new Request( CommonVars.getCurrUser()), cancelHead, true); // 表体 Company company = (Company) CommonVars.getCurrUser().getCompany(); CommonDataSource imgExgDS = new CommonDataSource(imgExgs); List headlist = new Vector(); headlist.add(cancelHead); CommonDataSource companyDS = new CommonDataSource(headlist); InputStream masterReportStream = DgCancelOwner.class .getResourceAsStream("report/cancelReport.jasper"); InputStream detailReportStream = DgCancelOwner.class .getResourceAsStream("report/cancelReportSub.jasper"); try { JasperReport detailReport = (JasperReport) JRLoader .loadObject(detailReportStream); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("name", company.getName()); parameters.put("code", company.getCode()); parameters.put("imgExgDS", imgExgDS);// 子数据源 parameters.put("detailReport", detailReport);// 子报表 parameters.put("tel", company.getTel()); parameters.put("owner", company.getOwner()); JasperPrint jasperPrint; jasperPrint = JasperFillManager.fillReport(masterReportStream, parameters, companyDS); DgReportViewer viewer = new DgReportViewer(jasperPrint); viewer.setVisible(true); } catch (JRException e1) { e1.printStackTrace(); } } } private JSplitPane getSplitPane_1() { if (splitPane_1 == null) { splitPane_1 = new JSplitPane(); splitPane_1.setOrientation(JSplitPane.VERTICAL_SPLIT); splitPane_1.setOneTouchExpandable(true); splitPane_1.setDividerSize(5); splitPane_1.setBottomComponent(getPanel()); splitPane_1.setLeftComponent(getPanel_1()); splitPane_1.setDividerLocation(120); } return splitPane_1; } private JButton getBtnEdit() { if (btnEdit == null) { btnEdit = new JButton("修改"); btnEdit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if ("修改".equals(btnEdit.getText())) { // btnEdit.setEnabled(false); btnEdit.setText("取消修改"); btnSaveData.setEnabled(true); if (treeModel != null) { treeModel.setCellEditable(true); } } else { btnEdit.setText("修改"); initTreeTable(); } setState(false); } }); } return btnEdit; } public void setState(boolean boo) { btnAddParent.setEnabled(boo); btnAddChild.setEnabled(boo); btnEdit.setEnabled(boo); btnSaveData.setEnabled(!boo); btnDelette.setEnabled(boo); btnHidden.setEnabled(boo); } private JButton getBtnSaveData() { if (btnSaveData == null) { btnSaveData = new JButton("保存"); btnSaveData.setEnabled(false); btnSaveData.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List<ECSAttachmentManagement> ls = ((AttachmentTableModel) ((TreeTableModelAdapter) treeTable .getModel()).getModel()).getData(); ecsCheckStockAction.saveECSAttachment(request, ls); btnEdit.setEnabled(true); if (treeModel != null) { treeModel.setCellEditable(false); } btnSaveData.setEnabled(false); btnEdit.setText("修改"); initTreeTable(); setState(true); } }); } return btnSaveData; } private JButton getBtnDelette() { if (btnDelette == null) { btnDelette = new JButton("删除"); btnDelette.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ECSAttachmentManagement attachment = getDataByRow(); if (attachment == null) { return; } if (attachment.getIsTemplate() != null && attachment.getIsTemplate()) { JOptionPane.showMessageDialog(FmECSAttachment.this, "模板允许删除!"); return; } ecsCheckStockAction.deleteAttachment(request, attachment); initTreeTable(); } }); } return btnDelette; } public ECSAttachmentManagement getDataByRow() { int row = treeTable.getSelectedRow(); Object obj = ((TreeTableModelAdapter) treeTable.getModel()) .getDataByRow(row); if (obj instanceof ECSAttachmentManagement) { return (ECSAttachmentManagement) obj; } return null; } private JPanel getPanel_1() { if (panel_1 == null) { panel_1 = new JPanel(); panel_1.setLayout(new BorderLayout(0, 0)); panel_1.add(getToolBar_1(), BorderLayout.NORTH); panel_1.add(getScrollPane_1(), BorderLayout.CENTER); } return panel_1; } private JToolBar getToolBar_1() { if (toolBar_1 == null) { toolBar_1 = new JToolBar(); toolBar_1.add(getBtnAdd()); toolBar_1.add(getBtnDeleteSection()); } return toolBar_1; } private JButton getBtnDeleteSection() { if (btnDeleteSection == null) { btnDeleteSection = new JButton("删除"); btnDeleteSection.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ECSSection section = (ECSSection) tableModel .getCurrentRow(); section.setIsExist(false); ecsCheckStockAction.saveEcsSection(request, section); tableModel.deleteRow(section); ecsCheckStockAction.deleteAttachment(request, section); initTreeTable(); } }); } return btnDeleteSection; } private JButton getBtnExportExcel() { if (btnExportExcel == null) { btnExportExcel = new JButton("导出Excel"); btnExportExcel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ECSAttachmentManagement attachment = getDataByRow(); if (attachment == null) { return; } File file = getSelectFile(attachment.getProjectContent() + ".xls"); AttachmentExportExcel exportExecl = new AttachmentExportExcel( attachment, file); exportExecl.exportExcel(); } }); } return btnExportExcel; } /** * 获得保存的文件名 * * @return */ private File getSelectFile(String fileName) { JFileChooser fileChooser = new JFileChooser("./"); fileChooser.setDialogTitle("请选择文件的存放路径!"); fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("xls", "xls")); fileChooser.setSelectedFile(new File(fileName)); int state = fileChooser.showDialog(FmECSAttachment.this, "保存"); File file = null; if (state == JFileChooser.APPROVE_OPTION) { file = fileChooser.getSelectedFile(); } else { return null; } if (getFileExtension(file.getAbsolutePath()) != null && !"xls".equals(getFileExtension(file.getAbsolutePath()))) { file = new File(file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(".")) + ".xls"); } if (!file.exists()) { try { file.createNewFile(); } catch (IOException e1) { e1.printStackTrace(); } } return file; } }
//
package com.bestway.bcus.client.checkstock.jtreeTable; import javax.swing.tree.*; import javax.swing.event.*; /** * An abstract implementation of the TreeTableModel interface, handling * the list of listeners. * * @version %I% %G% * * @author Philip Milne */ public abstract class AbstractTreeTableModel implements TreeTableModel { protected Object root; protected EventListenerList listenerList = new EventListenerList(); public AbstractTreeTableModel() { } public AbstractTreeTableModel(Object root) { this.root = root; } // // Default implementations for methods in the TreeModel interface. // public Object getRoot() { return root; } public void setRoot(Object root) { this.root = root; } public boolean isLeaf(Object node) { return getChildCount(node) == 0; } public void valueForPathChanged(TreePath path, Object newValue) {} // This is not called in the JTree's default mode: // use a naive implementation. public int getIndexOfChild(Object parent, Object child) { for (int i = 0; i < getChildCount(parent); i++) { if (getChild(parent, i).equals(child)) { return i; } } return -1; } public void addTreeModelListener(TreeModelListener l) { listenerList.add(TreeModelListener.class, l); } public void removeTreeModelListener(TreeModelListener l) { listenerList.remove(TreeModelListener.class, l); } /* * Notifies all listeners that have registered interest for * notification on this event type. The event instance * is lazily created using the parameters passed into * the fire method. * @see EventListenerList */ protected void fireTreeNodesChanged(Object source, Object[] path, int[] childIndices, Object[] children) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); TreeModelEvent e = null; // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==TreeModelListener.class) { // Lazily create the event: if (e == null) e = new TreeModelEvent(source, path, childIndices, children); ((TreeModelListener)listeners[i+1]).treeNodesChanged(e); } } } /* * Notifies all listeners that have registered interest for * notification on this event type. The event instance * is lazily created using the parameters passed into * the fire method. * @see EventListenerList */ protected void fireTreeNodesInserted(Object source, Object[] path, int[] childIndices, Object[] children) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); TreeModelEvent e = null; // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==TreeModelListener.class) { // Lazily create the event: if (e == null) e = new TreeModelEvent(source, path, childIndices, children); ((TreeModelListener)listeners[i+1]).treeNodesInserted(e); } } } /* * Notifies all listeners that have registered interest for * notification on this event type. The event instance * is lazily created using the parameters passed into * the fire method. * @see EventListenerList */ protected void fireTreeNodesRemoved(Object source, Object[] path, int[] childIndices, Object[] children) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); TreeModelEvent e = null; // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==TreeModelListener.class) { // Lazily create the event: if (e == null) e = new TreeModelEvent(source, path, childIndices, children); ((TreeModelListener)listeners[i+1]).treeNodesRemoved(e); } } } /* * Notifies all listeners that have registered interest for * notification on this event type. The event instance * is lazily created using the parameters passed into * the fire method. * @see EventListenerList */ protected void fireTreeStructureChanged(Object source, Object[] path, int[] childIndices, Object[] children) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); TreeModelEvent e = null; // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length-2; i>=0; i-=2) { if (listeners[i]==TreeModelListener.class) { // Lazily create the event: if (e == null) e = new TreeModelEvent(source, path, childIndices, children); ((TreeModelListener)listeners[i+1]).treeStructureChanged(e); } } } // // Default impelmentations for methods in the TreeTableModel interface. // public Class getColumnClass(int column) { return Object.class; } /** By default, make the column with the Tree in it the only editable one. * Making this column editable causes the JTable to forward mouse * and keyboard events in the Tree column to the underlying JTree. */ public boolean isCellEditable(Object node, int column) { return getColumnClass(column) == TreeTableModel.class; } public void setValueAt(Object aValue, Object node, int column) {} // Left to be implemented in the subclass: /* * public Object getChild(Object parent, int index) * public int getChildCount(Object parent) * public int getColumnCount() * public String getColumnName(Object node, int column) * public Object getValueAt(Object node, int column) */ }
//
package com.bestway.bcus.client.checkstock.jtreeTable; import java.util.List; import java.util.Vector; import javax.swing.tree.DefaultMutableTreeNode; import org.apache.commons.lang.time.DateFormatUtils; import com.bestway.bcus.checkstock.entity.ECSAttachmentManagement; import com.bestway.common.BaseEntity; public class AttachmentTableModel extends AbstractTreeTableModel implements TreeTableModel { private boolean isCellEditable = false; //列名 public List<String> colNames; //数据 public List<ECSAttachmentManagement> data; public AttachmentTableModel(Object root) { super(root); } //列的类型 static protected Class[] colTypes = { TreeTableModel.class,String.class,String.class, String.class,String.class,String.class, String.class,String.class,String.class, String.class,String.class,String.class, String.class,String.class}; // public AttachmentTableModel(List<String> columnNames, List<ECSAttachmentManagement> dataVector) { this.colNames = columnNames; this.data = dataVector; DefaultMutableTreeNode top = new DefaultMutableTreeNode("ROOT"); createNodes(top); this.setRoot(top); } public void setCellEditable(boolean isCellEditable) { this.isCellEditable = isCellEditable; } public boolean isCellEditable(){ return isCellEditable; } //设置数据 public List<ECSAttachmentManagement> getData(){ return this.data; } public void setData(Vector<ECSAttachmentManagement> entityVector) { data = entityVector; } //创建节点 private void createNodes(DefaultMutableTreeNode top) { for (int i = 0; i < data.size(); i++) { ECSAttachmentManagement parentAttachment = data.get(i); DefaultMutableTreeNode parentNode = new DefaultMutableTreeNode(parentAttachment); if(parentAttachment.getChildren()!=null){ //当是否隐藏为空或者为false时候才添加节点 if(parentAttachment.getIsHidden()==null||parentAttachment.getIsHidden()==false){ for (int j = 0; j < parentAttachment.getChildren().size(); j++) { ECSAttachmentManagement childAttachment = parentAttachment.getChildren().get(j); DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(childAttachment); parentNode.add(childNode); } } } top.add(parentNode); } } /** * @return 获得节点对象 * @param rowIndex * * */ public Object getObjectByNode(Object node) { Object obj = null; if (node instanceof DefaultMutableTreeNode) { obj = ((DefaultMutableTreeNode) node).getUserObject(); } else { obj = node; } return obj; } public Class<?> getColumnClass(int column) { return colTypes[column]; } @Override public int getColumnCount() { return colNames.size(); } @Override public String getColumnName(int column) { return colNames.get(column); } /** * 获取行数据 * @param index * @return */ public <T> T getRowData(int index){ return (T)data.get(index); } @Override public boolean isCellEditable(Object node, int column) { if(column==8){ return true; } if(column != 0 && isCellEditable == false) return false; ECSAttachmentManagement attachment = (ECSAttachmentManagement)getObjectByNode(node); if(attachment.getParentId() == null){ return column == 0; }else { return column < 5; } } @Override public Object getValueAt(Object node, int column) { //渲染表格 显示数据 ECSAttachmentManagement attachment = null; Object useObj = getObjectByNode(node); if (useObj == null) { return null; } if(useObj instanceof BaseEntity){ attachment=(ECSAttachmentManagement) useObj; }else{ return column == 0 ? useObj.toString() : ""; } switch (column) { //现在我把名称渲染到第二列 case 0: return attachment.getProjectContent(); case 1: return attachment.getDataContent(); case 2: return attachment.getProvideUnit(); case 3: return attachment.getDataType(); case 4: return attachment.getRequirements(); case 5: return attachment.getUsingSeal(); case 6: return attachment.getDataSignature(); case 7: return attachment.getAttachmentName(); case 8: return attachment.getControlsState(); case 9: if(attachment.getCreateDate()==null){ return null; }else{ return DateFormatUtils.format(attachment.getCreateDate(),"yyyy-MM-dd"); } case 10: return attachment.getCreatePeople(); case 11: if(attachment.getUpdateDate()==null){ return null; }else{ return DateFormatUtils.format(attachment.getUpdateDate(),"yyyy-MM-dd"); } case 12: return attachment.getUpdatePeople(); case 13: if(attachment.getIsHidden()==null||attachment.getIsHidden()==false){ return ""; }else{ return "是"; } } return null; } @Override public void setValueAt(Object aValue, Object node, int column) { ECSAttachmentManagement attachment = ((ECSAttachmentManagement)getObjectByNode(node)); String value = (String)aValue; switch (column) { //现在我把名称渲染到第二列 case 0: attachment.setProjectContent(value); break; case 1: attachment.setDataContent(value); break; case 2: attachment.setProvideUnit(value); break; case 3: attachment.setDataType(value); break; case 4: attachment.setRequirements(value); break; case 5: attachment.setUsingSeal(value); break; case 6: attachment.setDataSignature(value); break; } } @Override public Object getChild(Object parent, int index) { if (parent instanceof DefaultMutableTreeNode) { return ((DefaultMutableTreeNode) parent).getChildAt(index); } else { return null; } } @Override public int getChildCount(Object parent) { Object o = getObjectByNode(parent); if(o instanceof ECSAttachmentManagement){ ECSAttachmentManagement att =((ECSAttachmentManagement)o); List<ECSAttachmentManagement> ch = att.getChildren(); return ch == null || Boolean.TRUE.equals(att.getIsHidden()) ? 0 : ch.size(); }else{ return ((DefaultMutableTreeNode)parent).getChildCount(); } } public boolean isLeaf(Object node) { Object o = getObjectByNode(node); if(o instanceof ECSAttachmentManagement){ String pid = ((ECSAttachmentManagement)getObjectByNode(node)).getParentId(); return pid != null; } return ((DefaultMutableTreeNode)node).getChildCount() == 0; } }
//
package com.bestway.bcus.client.checkstock.jtreeTable; import javax.swing.DefaultCellEditor; import javax.swing.ImageIcon; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.ListSelectionModel; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.tree.*; import javax.swing.table.*; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; import com.bestway.bcus.checkstock.entity.ECSAttachmentManagement; import java.awt.Color; import java.awt.Dimension; import java.awt.Component; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.util.Enumeration; import java.util.EventObject; /** * This example shows how to create a simple JTreeTable component, by using a * JTree as a renderer (and editor) for the cells in a particular column in the * JTable. * * @version %I% %G% * * @author Philip Milne * @author Scott Violet */ public class JTreeTable extends JTable { /** A subclass of JTree. */ protected TreeTableCellRenderer tree; private String textProperty; public String getTextProperty() { return textProperty; } public void setTextProperty(String textProperty) { this.textProperty = textProperty; } public JTreeTable(TreeTableModel treeTableModel) { super(); init(treeTableModel); } public void setModel(TreeTableModel treeTableModel){ init(treeTableModel); } private void init(TreeTableModel treeTableModel){ // Creates the tree. It will be used as a renderer and editor. tree = new TreeTableCellRenderer(treeTableModel); tree.setRootVisible(false); // Installs a tableModel representing the visible rows in the tree. super.setModel(new TreeTableModelAdapter(treeTableModel, tree)); // Forces the JTable and JTree to share their row selection models. ListToTreeSelectionModelWrapper selectionWrapper = new ListToTreeSelectionModelWrapper(); tree.setSelectionModel(selectionWrapper); setSelectionModel(selectionWrapper.getListSelectionModel()); // Installs the tree editor renderer and editor. setDefaultRenderer(TreeTableModel.class, tree); setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor()); TableCellEditor cellEditor = getDefaultEditor(String.class); if(cellEditor instanceof DefaultCellEditor){ ((DefaultCellEditor)cellEditor).setClickCountToStart(1); } // 显示格子线 setShowGrid(true); //不显示垂直线条 setShowVerticalLines(false); setAutoResizeMode(AUTO_RESIZE_OFF); // No intercell spacing setIntercellSpacing(new Dimension(0,2)); // And update the height of the trees row to match that of // the table. // if (tree.getRowHeight() < 1) { // // Metal looks better like this. // } setRowHeight(35); TreeNode root = (TreeNode) tree.getModel().getRoot(); expandAll(tree, new TreePath(root)); } /** * 展开所有节点 * @param tree * @param parent */ private void expandAll(TreeTableCellRenderer tree, TreePath parent) { TreeNode node = (TreeNode) parent.getLastPathComponent(); if (node.getChildCount() >= 0) { for (Enumeration e = node.children(); e.hasMoreElements();) { TreeNode n = (TreeNode) e.nextElement(); TreePath path = parent.pathByAddingChild(n); expandAll(tree, path); tree.expandPath(parent); } } } /** * Overridden to message super and forward the method to the tree. Since the * tree is not actually in the component hierarchy it will never receive * this unless we forward it in this manner. */ public void updateUI() { super.updateUI(); if (tree != null) { tree.updateUI(); // Do this so that the editor is referencing the current renderer // from the tree. The renderer can potentially change each time // laf changes. setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor()); } // Use the tree's default foreground and background colors in the // table. LookAndFeel.installColorsAndFont(this, "Tree.background", "Tree.foreground", "Tree.font"); } /** * Workaround for BasicTableUI anomaly. Make sure the UI never tries to * resize the editor. The UI currently uses different techniques to paint * the renderers and editors; overriding setBounds() below is not the right * thing to do for an editor. Returning -1 for the editing row in this case, * ensures the editor is never painted. */ public int getEditingRow() { return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1 : editingRow; } /** * Returns the actual row that is editing as <code>getEditingRow</code> will * always return -1. */ private int realEditingRow() { return editingRow; } /** * This is overridden to invoke super's implementation, and then, if the * receiver is editing a Tree column, the editor's bounds is reset. The * reason we have to do this is because JTable doesn't think the table is * being edited, as <code>getEditingRow</code> returns -1, and therefore * doesn't automatically resize the editor for us. */ public void sizeColumnsToFit(int resizingColumn) { super.sizeColumnsToFit(resizingColumn); if (getEditingColumn() != -1 && getColumnClass(editingColumn) == TreeTableModel.class) { Rectangle cellRect = getCellRect(realEditingRow(),getEditingColumn(), false); Component component = getEditorComponent(); component.setBounds(cellRect); component.validate(); } } /** * Overridden to pass the new rowHeight to the tree. */ public void setRowHeight(int rowHeight) { super.setRowHeight(rowHeight); if (tree != null && tree.getRowHeight() != rowHeight) { tree.setRowHeight(getRowHeight()); } } // @Override // public void changeSelection(int rowIndex, int columnIndex, boolean toggle, // boolean extend) { // boolean editable = ((TreeTableModelAdapter)getModel()).getModel().isCellEditable(); // if(editable){ // super.changeSelection(rowIndex, columnIndex, toggle, extend); // super.editCellAt(rowIndex, columnIndex, null); // } // } /** * Returns the tree that is being shared between the model. */ public JTree getTree() { return tree; } /** * Overridden to invoke repaint for the particular location if the column * contains the tree. This is done as the tree editor does not fill the * bounds of the cell, we need the renderer to paint the tree in the * background, and then draw the editor over it. */ public boolean editCellAt(int row, int column, EventObject e) { boolean retValue = super.editCellAt(row, column, e); if (retValue && getColumnClass(column) == TreeTableModel.class) { repaint(getCellRect(row, column, false)); } return retValue; } /** * 一个TreeCellRender JTree的子类 用语显示一棵树 */ public class TreeTableCellRenderer extends JTree implements TableCellRenderer { /** Last table/tree row asked to renderer. */ protected int visibleRow; /** * Border to draw around the tree, if this is non-null, it will be * painted. */ protected Border highlightBorder; public TreeTableCellRenderer(TreeModel model) { super(model); } /** * updateUI is overridden to set the colors of the Tree's renderer to * match that of the table. */ public void updateUI() { super.updateUI(); // Make the tree's cell renderer use the table's cell selection // colors. TreeCellRenderer tcr = getCellRenderer(); if (tcr instanceof DefaultTreeCellRenderer) { DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr); // For 1.1 uncomment this, 1.2 has a bug that will cause an // exception to be thrown if the border selection color is // null. // dtcr.setBorderSelectionColor(null); dtcr.setTextSelectionColor(UIManager .getColor("Table.selectionForeground")); dtcr.setBackgroundSelectionColor(UIManager .getColor("Table.selectionBackground")); } } /** * Sets the row height of the tree, and forwards the row height to the * table. */ public void setRowHeight(int rowHeight) { if (rowHeight > 0) { super.setRowHeight(rowHeight); if (JTreeTable.this != null && JTreeTable.this.getRowHeight() != rowHeight) { JTreeTable.this.setRowHeight(getRowHeight()); } } } /** * This is overridden to set the height to match that of the JTable. */ public void setBounds(int x, int y, int w, int h) { super.setBounds(x, 0, w, JTreeTable.this.getHeight()); } /** * Sublcassed to translate the graphics such that the last visible row * will be drawn at 0,0. */ public void paint(Graphics g) { g.translate(0, -visibleRow * getRowHeight()); super.paint(g); // Draw the Table border if we have focus. if (highlightBorder != null) { highlightBorder.paintBorder(this, g, 0, visibleRow * getRowHeight(), getWidth(), getRowHeight()); } } @Override public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { // if(leaf){ // if(value instanceof DefaultMutableTreeNode){ // value = ((DefaultMutableTreeNode)value).getUserObject(); // try { // if(value instanceof ECSAttachmentManagement){ // ECSAttachmentManagement attachment = (ECSAttachmentManagement)value; // return attachment.getProjectContent(); // } // return value.toString(); // } catch (Exception e) { // e.printStackTrace(); // } // } // } if(value instanceof DefaultMutableTreeNode){ value = ((DefaultMutableTreeNode)value).getUserObject(); try { if(value instanceof String){ return (String)value; // ECSAttachmentManagement attachment = (ECSAttachmentManagement)value; // Pro // return attachment.getProjectContent(); }else{ return BeanUtils.getSimpleProperty(value, textProperty); } // return value.toString(); } catch (Exception e) { e.printStackTrace(); } } return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus); } /** * TreeCellRenderer method. Overridden to update the visible row. */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Color background; Color foreground; if (isSelected) { background = table.getSelectionBackground(); foreground = table.getSelectionForeground(); } else { background = table.getBackground(); foreground = table.getForeground(); } highlightBorder = null; if (realEditingRow() == row && getEditingColumn() == column) { background = UIManager.getColor("Table.focusCellBackground"); foreground = UIManager.getColor("Table.focusCellForeground"); } else if (hasFocus) { highlightBorder = UIManager .getBorder("Table.focusCellHighlightBorder"); if (isCellEditable(row, column)) { background = UIManager .getColor("Table.focusCellBackground"); foreground = UIManager .getColor("Table.focusCellForeground"); } } visibleRow = row; setBackground(background); TreeCellRenderer tcr = getCellRenderer(); if (tcr instanceof DefaultTreeCellRenderer) { DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr); // ImageIcon image = new ImageIcon("/1.png"); ImageIcon image1 = new ImageIcon(getClass().getResource("1.png")); ImageIcon image2 = new ImageIcon(getClass().getResource("2.png")); ImageIcon image3 = new ImageIcon(getClass().getResource("3.png")); dtcr.setClosedIcon(image2); dtcr.setOpenIcon(image1); dtcr.setLeafIcon(image3); if (isSelected) { dtcr.setTextSelectionColor(foreground); dtcr.setBackgroundSelectionColor(background); } else { dtcr.setTextNonSelectionColor(foreground); dtcr.setBackgroundNonSelectionColor(background); } } return this; } } public class TreeTableCellEditor extends DefaultCellEditor { public TreeTableCellEditor() { super(new TreeTableTextField()); } /** * Overridden to determine an offset that tree would place the editor * at. The offset is determined from the <code>getRowBounds</code> JTree * method, and additionally from the icon DefaultTreeCellRenderer will * use. * <p> * The offset is then set on the TreeTableTextField component created in * the constructor, and returned. */ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int r, int c) { Component component = super.getTableCellEditorComponent(table, value, isSelected, r, c); // JTree t = getTree(); // boolean rv = t.isRootVisible(); // int offsetRow = rv ? r : r - 1; // Rectangle bounds = t.getRowBounds(offsetRow); // if(bounds == null) // return component; // int offset = bounds.x; // TreeCellRenderer tcr = t.getCellRenderer(); // if (tcr instanceof DefaultTreeCellRenderer) { // Object node = t.getPathForRow(offsetRow).getLastPathComponent(); // Icon icon; // if (t.getModel().isLeaf(node)) // icon = ((DefaultTreeCellRenderer) tcr).getLeafIcon(); // else if (tree.isExpanded(offsetRow)) // icon = ((DefaultTreeCellRenderer) tcr).getOpenIcon(); // else // icon = ((DefaultTreeCellRenderer) tcr).getClosedIcon(); // if (icon != null) { // offset += ((DefaultTreeCellRenderer) tcr).getIconTextGap() // + icon.getIconWidth(); // } // } // ((TreeTableTextField) getComponent()).offset = offset; // System.out.println(value); return component; } /** * This is overridden to forward the event to the tree. This will return * true if the click count >= 3, or the event is null. */ public boolean isCellEditable(EventObject e) { if (e instanceof MouseEvent) { MouseEvent me = (MouseEvent) e; // If the modifiers are not 0 (or the left mouse button), // tree may try and toggle the selection, and table // will then try and toggle, resulting in the // selection remaining the same. To avoid this, we // only dispatch when the modifiers are 0 (or the left mouse // button). if (me.getModifiers() == 0 || me.getModifiers() == InputEvent.BUTTON1_MASK) { for (int counter = getColumnCount() - 1; counter >= 0; counter--) { if (getColumnClass(counter) == TreeTableModel.class) { MouseEvent newME = new MouseEvent( JTreeTable.this.tree, me.getID(), me.getWhen(), me.getModifiers(), me.getX()- getCellRect(0, counter, true).x, me.getY(), me.getClickCount(), me.isPopupTrigger()); JTreeTable.this.tree.dispatchEvent(newME); break; } } } boolean editable = ((TreeTableModelAdapter)getModel()).getModel().isCellEditable(); if (editable && me.getClickCount() >= 1) { return true; } return false; } if (e == null) { return true; } return false; } } /** * Component used by TreeTableCellEditor. The only thing this does is to * override the <code>reshape</code> method, and to ALWAYS make the x * location be <code>offset</code>. */ static class TreeTableTextField extends JTextField { public int offset; public void reshape(int x, int y, int w, int h) { int newX = Math.max(x, offset); super.reshape(newX, y, w - (newX - x), h); } } /** * ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel to * listen for changes in the ListSelectionModel it maintains. Once a change * in the ListSelectionModel happens, the paths are updated in the * DefaultTreeSelectionModel. */ class ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel { /** Set to true when we are updating the ListSelectionModel. */ protected boolean updatingListSelectionModel; public ListToTreeSelectionModelWrapper() { super(); getListSelectionModel().addListSelectionListener( createListSelectionListener()); } /** * Returns the list selection model. ListToTreeSelectionModelWrapper * listens for changes to this model and updates the selected paths * accordingly. */ ListSelectionModel getListSelectionModel() { return listSelectionModel; } /** * This is overridden to set <code>updatingListSelectionModel</code> and * message super. This is the only place DefaultTreeSelectionModel * alters the ListSelectionModel. */ public void resetRowSelection() { if (!updatingListSelectionModel) { updatingListSelectionModel = true; try { super.resetRowSelection(); } finally { updatingListSelectionModel = false; } } // Notice how we don't message super if // updatingListSelectionModel is true. If // updatingListSelectionModel is true, it implies the // ListSelectionModel has already been updated and the // paths are the only thing that needs to be updated. } /** * Creates and returns an instance of ListSelectionHandler. */ protected ListSelectionListener createListSelectionListener() { return new ListSelectionHandler(); } /** * If <code>updatingListSelectionModel</code> is false, this will reset * the selected paths from the selected rows in the list selection * model. */ protected void updateSelectedPathsFromSelectedRows() { if (!updatingListSelectionModel) { updatingListSelectionModel = true; try { // This is way expensive, ListSelectionModel needs an // enumerator for iterating. int min = listSelectionModel.getMinSelectionIndex(); int max = listSelectionModel.getMaxSelectionIndex(); clearSelection(); if (min != -1 && max != -1) { for (int counter = min; counter <= max; counter++) { if (listSelectionModel.isSelectedIndex(counter)) { TreePath selPath = tree.getPathForRow(counter); if (selPath != null) { addSelectionPath(selPath); } } } } } finally { updatingListSelectionModel = false; } } } /** * Class responsible for calling updateSelectedPathsFromSelectedRows * when the selection of the list changse. */ class ListSelectionHandler implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { updateSelectedPathsFromSelectedRows(); } } } }
//
package com.bestway.bcus.client.checkstock.jtreeTable; import javax.swing.tree.TreeModel; /** * TreeTableModel is the model used by a JTreeTable. It extends TreeModel * to add methods for getting inforamtion about the set of columns each * node in the TreeTableModel may have. Each column, like a column in * a TableModel, has a name and a type associated with it. Each node in * the TreeTableModel can return a value for each of the columns and * set that value if isCellEditable() returns true. * * @version %I% %G% * * @author Philip Milne * @author Scott Violet */ public interface TreeTableModel extends TreeModel { /** * Returns the number of available columns. */ public int getColumnCount(); /** * Returns the name for column number <code>column</code>. */ public String getColumnName(int column); /** * Returns the type for column number <code>column</code>. */ public Class getColumnClass(int column); /** * Returns the value to be displayed for node <code>node</code>, * at column number <code>column</code>. */ public Object getValueAt(Object node, int column); /** * Indicates whether the the value for node <code>node</code>, * at column number <code>column</code> is editable. */ public boolean isCellEditable(Object node, int column); /* * 是否可编辑 */ public boolean isCellEditable(); /** * Sets the value for node <code>node</code>, * at column number <code>column</code>. */ public void setValueAt(Object aValue, Object node, int column); }
///
package com.bestway.bcus.client.checkstock.jtreeTable; import javax.swing.JTree; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.table.AbstractTableModel; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; /** * This is a wrapper class takes a TreeTableModel and implements the table model * interface. The implementation is trivial, with all of the event dispatching * support provided by the superclass: the AbstractTableModel. * * @version %I% %G% * * @author Philip Milne * @author Scott Violet */ public class TreeTableModelAdapter extends AbstractTableModel { JTree tree; TreeTableModel treeTableModel; public TreeTableModelAdapter(TreeTableModel treeTableModel, JTree tree) { this.tree = tree; this.treeTableModel = treeTableModel; tree.addTreeExpansionListener(new TreeExpansionListener() { // Don't use fireTableRowsInserted() here; // the selection model would get updated twice. public void treeExpanded(TreeExpansionEvent event) { fireTableDataChanged(); } public void treeCollapsed(TreeExpansionEvent event) { fireTableDataChanged(); } }); } public TreeTableModel getModel() { return treeTableModel; } // Wrappers, implementing TableModel interface. public int getColumnCount() { return treeTableModel.getColumnCount(); } public String getColumnName(int column) { return treeTableModel.getColumnName(column); } public Class getColumnClass(int column) { return treeTableModel.getColumnClass(column); } public int getRowCount() { return tree.getRowCount(); } protected Object nodeForRow(int row) { TreePath treePath = tree.getPathForRow(row); return treePath.getLastPathComponent(); } /** * 获取行数据 * @param row * @return */ public <T> T getDataByRow(int row){ TreePath treePath = tree.getPathForRow(row); if(treePath==null){ return null; } return (T)((DefaultMutableTreeNode)treePath.getLastPathComponent()).getUserObject(); } public Object getValueAt(int row, int column) { return treeTableModel.getValueAt(nodeForRow(row), column); } public boolean isCellEditable(int row, int column) { return treeTableModel.isCellEditable(nodeForRow(row), column); } public void setValueAt(Object value, int row, int column) { treeTableModel.setValueAt(value, nodeForRow(row), column); } }
//
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步