当前位置: 首页 > 图灵资讯 > 技术篇> 实现 Swing 的 JTables 和 Excel 间的复制和粘贴功能

实现 Swing 的 JTables 和 Excel 间的复制和粘贴功能

来源:图灵教育
时间:2024-02-25 14:01:27

如今,许多业务应用程序都被使用 Java 开发,以后用这个 Java 会有更多的开发应用。在许多应用程序中使用 Swing 的 JTable 组件以类似电子表格的格式显示数据。如果业务应用程序能够导入数据 Microsoft Excel 和从 Microsoft Excel 导出数据会给用户带来方便,让用户可以使用无处不在的电子表格程序的强大功能。此 Java 提示将帮助您了解系统剪贴板,并使您的剪贴板 JTable 能够与 Excel 互动和互操作。您将看到,此有用功能的添加可以通过在当前应用程序中添加另一行代码来实现。

要实现这一目标,我们需要做的就是复制这里给出的文件 ExcelAdapter.java,编译并确保您的应用程序能够找到 ExcelAdapter.class 文件完成后,JTable 就可以与 Excel 打电话!我们将向您展示如何通过这一行代码实现它 Excel 的复制 (Ctrl+C) 和粘贴 (Ctrl+V) 以及从 Excel 复制粘贴。此外,它还提供了一个使用 ExcelAdapter 示例应用程序。

代码 以下是实际完成此任务的适配器代码(称为 ExcelAdapter.java):

import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.datatransfer.*; import java.util.*; /** * ExcelAdapter 实现 JTables 中复制粘贴 * 剪贴板功能。 适配器使用的剪贴板数据格式 * 与 Excel 所用剪贴板格式兼容。 适配器使用的剪贴板数据格式 * 与 Excel 所使用的剪贴板格式兼容。这提供了 * 支持的 JTables 和 Excel 互操作。 */ public class ExcelAdapter implements ActionListener { private String rowstring,value; private Clipboard system; private StringSelection stsel; private JTable jtable1 ; /** * Excel 适配器由 JTable 构成, * 它实现了 JTable 复制粘贴 * 功能,并充当剪贴板监控程序。 */ public ExcelAdapter(JTable myJTable) { jtable1 = myJTable; KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK,false); // 确定复制按钮用户可以修改它 // 复制其他按键组合的功能。 KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK,false); // 确定用户可以修改粘贴按钮 // 复制其他按键组合的功能。 jtable1.registerKeyboardAction(this,"Copy",copy,JComponent.WHEN_FOCUSED); jtable1.registerKeyboardAction(this,"Paste",paste,JComponent.WHEN_FOCUSED); system = Toolkit.getDefaultToolkit().getSystemClipboard(); } /** * 该适配器运行图表的公共读取方法。 */ public JTable getJTable() {return jtable1;} public void setJTable(JTable jtable1) {this.jtable1=jtable1;} /** * 这种方法在我们监控实现的按钮上激活。 * 在这里,它监控复制和粘贴 ActionCommands。 * 在这里,它监控复制和粘贴 ActionCommands。 * 不相邻单元格的选择导致选择无效, * 此后,复制动作无法执行。 * 粘贴的方法是将所选内容的左上角与 * JTable 对齐当前选定内容的第一个元素。 */ public void actionPerformed(ActionEvent e) { if (e.getActionCommand().compareTo("Copy")==0) { StringBuffer sbf=new StringBuffer(); // 检查确保我们只选择单元格 // 相邻块 int numcols=jtable1.getSelectedColumnCount(); int numrows=jtable1.getSelectedRowCount(); int[] rowsselected=jtable1.getSelectedRows(); int[] colsselected=jtable1.getSelectedColumns(); if (!((numrows-1==rowsselected[rowsselected.length-1]-rowsselected[0] && numrows==rowsselected.length) && (numcols-1==colsselected[colsselected.length-1]-colsselected[0] && numcols==colsselected.length))) { JOptionPane.showMessageDialog(null, "Invalid Copy Selection", "Invalid Copy Selection", JOptionPane.ERROR_MESSAGE); return; } for (int i=0;i<numrows;i++) { for (int j=0;j<numcols;j++) { sbf.append(jtable1.getValueAt(rowsselected[i],colsselected[j])); if (j<numcols-1) sbf.append("\t"); } sbf.append("\n"); } stsel = new StringSelection(sbf.toString()); system = Toolkit.getDefaultToolkit().getSystemClipboard(); system.setContents(stsel,stsel); } if (e.getActionCommand().compareTo("Paste")==0) { System.out.println("Trying to Paste"); int startRow=(jtable1.getSelectedRows())[0]; int startCol=(jtable1.getSelectedColumns())[0]; try { String trstring= (String)(system.getContents(this).getTransferData(DataFlavor.stringFlavor)); System.out.println("String is:"+trstring); StringTokenizer st1=new StringTokenizer(trstring,"\n"); for(int i=0;st1.hasMoreTokens();i++) { rowstring=st1.nextToken(); StringTokenizer st2=new StringTokenizer(rowstring,"\t"); for(int j=0;st2.hasMoreTokens();j++) { value=(String)st2.nextToken(); if (startRow+i< jtable1.getRowCount() && startCol+j< jtable1.getColumnCount()) jtable1.setValueAt(value,startRow+i,startCol+j); System.out.println("Putting "+ value+"at row="+startRow+i+"column="+startCol+j); } } } catch(Exception ex){ex.printStackTrace();} } } }

示例应用程序 以下是示例应用程序 Frame1.java,它使用 ExcelAdapter 实现 JTable 与 Excel 的兼容。

import java.awt.*; import javax.swing.*; public class Frame1 extends Frame { BorderLayout borderlayout1 = new BorderLayout(); JTable jtable1 ; Object[][] data=new Object[4][4]; Object header[]= {"Jan","Feb","Mar","Apr"}; public static void main(String args[]) { Frame1 myframe=new Frame1(); myframe.setSize(new Dimension(250,250)); myframe.setVisible(true); } public Frame1() { super(); try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { for (int i=0;i<4;i++) for (int j=0;j<4;j++) data[i][j]=new Integer(i*10+j); System.out.println("Header length="+header[1]); jtable1=new JTable(data,header); jtable1.setCellSelectionEnabled(true); this.setTitle("Excel Lent JTABLE"); jtable1.setBackground(Color.pink); this.setLayout(borderlayout1); this.setSize(new Dimension(400, 300)); this.setBackground(Color.white); this.add(jtable1, BorderLayout.CENTER); // 这是添加复制和粘贴功能的行! ExcelAdapter myAd = new ExcelAdapter(jtable1); } }

Excel 剪贴板格式 Excel 剪贴板格式非常简单。它用制表符分隔同一行上的元素,用换行符分隔行。这样,当您复制一组连续和/或相邻的单元格时,Excel 只在长字符串中标记电子表格数据,每个单元的格值由字符串中的制表符和换行符分开。如果所选单元格不相邻怎么办?很简单:Excel 不要让你把所选内容复制到剪贴板上。本文所述的适配器模仿此行为,如果所选单元格不相邻,则不会使您复制数据。在 Excel 会弹出一个对话框,告诉我们不要复制;适配器再次模仿此行为。

简单解释代码 要使用此功能,您需要下载 ExcelAdapter.java 编译文件,将示例应用程序中的最后一行添加到代码中的某个位置,以激活它 JTable 上适配器。

复制和粘贴功能的激活按钮已在适配器中注册。然后,无论何时键入激活按钮, actionPerformed 该方法将被调用。如果是复制操作,所选单元格数据将是 Excel 适当标记,并写入系统剪贴板。如果是粘贴操作,将系统剪贴板中的数据转换为字符串形式,并根据所选单元格进行分析植入 JTables 单元格中。

结论 使用用 Java 用户经常希望编写表格 Jtables 中的数据与 Excel 数据处理方法相似。它不是编写代码来实现每个代码 JTable 复制粘贴功能,但更简单地编写通用适配器,只需添加一行代码就可以添加到每个功能中 Jtable 中。此 Java Tip 中间提供的适配器正好做到这一点。