java 复制单元格内容吗_Java-JTable右键单击复制/粘贴菜单以一键复制单元格数据...

我创建了JPopupMenu.当我右键单击单元格时,它会显示在我的JTable上.但是,除非先双击然后突出显示数据,然后右键单击该当前单元格之外的任何位置以显示我的弹出菜单和复制选项,否则我无法复制该单元格中的数据.

我想在单元格中复制数据,而无需双击单元格并进入单元格编辑模式,然后我需要选择数据.

我怎样才能做到这一点?

popup = new JPopupMenu();

popup.setName("popupMenu");

menuItemCopy = new JMenuItem(new DefaultEditorKit.CopyAction());

menuItemCopy.setText("Copy");

menuItemCopy.setName("copy");

popup.add(menuItemCopy);

popup.addSeparator();

menuItemPaste = new JMenuItem(new DefaultEditorKit.PasteAction());

menuItemPaste.setText("Paste");

menuItemPaste.setName("paste");

popup.add(menuItemPaste);

这是我在JTable的MouseListener中的mouseReleased()和mousePressed()中的代码.

if(e.isPopupTrigger())

{

JTable source = (JTable)e.getSource();

int row = source.rowAtPoint( e.getPoint() );

int column = source.columnAtPoint( e.getPoint() );

gridView.popup.show(e.getComponent(), e.getX(), e.getY());

}

解决方法:

两件事情…

>我不确定您如何期望DefaultEditorKit.CopyAction和DefaultEditorKit.PasteAction与JTable一起使用,这些应该与JTextComponents一起使用…

> JTable只会在左键按下(或更改键盘导航)时突出显示该行,默认情况下,右键单击不会选中该行.

现在,我想使用JTable的组件弹出窗口支持,但这似乎消耗了所有鼠标事件,一旦它检测到弹出窗口触发器,就使(几乎)不可能在右键单击上突出显示行/列.

相反,我最终在我的MouseListener中添加了一个Highlight方法,该方法突出显示有问题的行/列,然后触发弹出窗口.

我这样做的原因是,与复制和粘贴相关联的Action除了表外没有其他任何概念,因此他们不知道单击了什么行/列.

这使这些操作可以集中于仅担心选择.

内容通过自定义可转移文件直接复制到系统剪贴板,该文件保留了单元格的原始类型,这意味着粘贴对象时无需重建对象.

import java.awt.Component;

import java.awt.EventQueue;

import java.awt.Point;

import java.awt.Toolkit;

import java.awt.datatransfer.Clipboard;

import java.awt.datatransfer.DataFlavor;

import java.awt.datatransfer.FlavorEvent;

import java.awt.datatransfer.FlavorListener;

import java.awt.datatransfer.Transferable;

import java.awt.datatransfer.UnsupportedFlavorException;

import java.awt.event.ActionEvent;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.io.File;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.AbstractAction;

import static javax.swing.Action.NAME;

import javax.swing.JFrame;

import javax.swing.JPopupMenu;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

import javax.swing.table.DefaultTableCellRenderer;

import javax.swing.table.DefaultTableModel;

public class TestTable100 {

public static void main(String[] args) {

new TestTable100();

}

public TestTable100() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

ex.printStackTrace();

}

DefaultTableModel model = new DefaultTableModel();

model.addColumn("Type");

model.addColumn("Column");

for (File file : new File(System.getProperty("user.home")).listFiles()) {

model.addRow(new Object[]{file, file});

}

JTable table = new JTable(model);

table.getColumnModel().getColumn(0).setCellRenderer(new FirstCellRenderer());

JFrame frame = new JFrame("Testing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new JScrollPane(table));

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

final JPopupMenu pm = new JPopupMenu();

pm.add(new CopyAction(table));

pm.add(new PasteAction(table));

table.addMouseListener(new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent e) {

if (e.isPopupTrigger()) {

highlightRow(e);

doPopup(e);

}

}

@Override

public void mouseReleased(MouseEvent e) {

if (e.isPopupTrigger()) {

highlightRow(e);

doPopup(e);

}

}

protected void doPopup(MouseEvent e) {

pm.show(e.getComponent(), e.getX(), e.getY());

}

protected void highlightRow(MouseEvent e) {

JTable table = (JTable) e.getSource();

Point point = e.getPoint();

int row = table.rowAtPoint(point);

int col = table.columnAtPoint(point);

table.setRowSelectionInterval(row, row);

table.setColumnSelectionInterval(col, col);

}

});

}

});

}

public class FirstCellRenderer extends DefaultTableCellRenderer {

@Override

public Component getTableCellRendererComponent(JTable table, Object value,

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

File f = (File) value;

super.getTableCellRendererComponent(table,

value, isSelected, hasFocus, row, column);

String prefix = f.isDirectory() ? "DIR" : "FILE";

setText(prefix);

return this;

}

}

public class CopyAction extends AbstractAction {

private JTable table;

public CopyAction(JTable table) {

this.table = table;

putValue(NAME, "Copy");

}

@Override

public void actionPerformed(ActionEvent e) {

int row = table.getSelectedRow();

int col = table.getSelectedColumn();

Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();

cb.setContents(new CellTransferable(table.getValueAt(row, col)), null);

}

}

public class PasteAction extends AbstractAction {

private JTable table;

public PasteAction(JTable table) {

this.table = table;

putValue(NAME, "Paste");

final Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();

cb.addFlavorListener(new FlavorListener() {

@Override

public void flavorsChanged(FlavorEvent e) {

setEnabled(cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR));

}

});

setEnabled(cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR));

}

@Override

public void actionPerformed(ActionEvent e) {

int row = table.getSelectedRow();

int col = table.getSelectedColumn();

Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();

if (cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR)) {

try {

Object value = cb.getData(CellTransferable.CELL_DATA_FLAVOR);

table.setValueAt(value, row, col);

} catch (UnsupportedFlavorException | IOException ex) {

ex.printStackTrace();

}

}

}

}

public static class CellTransferable implements Transferable {

public static final DataFlavor CELL_DATA_FLAVOR = new DataFlavor(Object.class, "application/x-cell-value");

private Object cellValue;

public CellTransferable(Object cellValue) {

this.cellValue = cellValue;

}

@Override

public DataFlavor[] getTransferDataFlavors() {

return new DataFlavor[]{CELL_DATA_FLAVOR};

}

@Override

public boolean isDataFlavorSupported(DataFlavor flavor) {

return CELL_DATA_FLAVOR.equals(flavor);

}

@Override

public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {

if (!isDataFlavorSupported(flavor)) {

throw new UnsupportedFlavorException(flavor);

}

return cellValue;

}

}

}

标签:java,swing,contextmenu,jtable,popup

来源: https://codeday.me/bug/20191009/1879271.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值