java - 如何使 JTable 单元格不可编辑,但应该能够选择并复制当前单元格中的值

标签 java swing jtable awt tablecelleditor

我试图使 JTable 单元格不可编辑,但如果我这样做,我将无法选择单个单元格值,而是当我尝试复制整个行时被选中 我只想复制选定的单元格值而不是整个行。有办法做到这一点吗?

public class EmployeeWin extends JFrame {

        DefaultTableModel model = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int row, int column){
                return false;
            }
        };
        Container cont = this.getContentPane();
        JTable tab = new JTable(model);
        private TableRowSorter<TableModel> rowSorter = new TableRowSorter<>(model);
        private final JTextField searchFilter = new JTextField();

        public EmpDataWin(List<EmployeeDTO> pEmployeeDTO) {
            initialize(pEmployeeDTO);
        }

        public void initialize(List<EmployeeDTO> pEmployeeDTOList) {

            JPanel panelParent = new JPanel(new BorderLayout());

            // Add Header

            model.addColumn("Employee Name");
            model.addColumn("Department");
            model.addColumn("Details");

           // Add data row to table

            for (EmployeeDTO aEmployeeDTO : pEmployeeDTOList) {
                model.addRow(new Object[] { aEmployeeDTO.getEmployee_Name(), aEmployeeDTO.getDepartment(),
                        aEmployeeDTO.getDetails()});
            }

            tab.setRowSorter(rowSorter);
            tab.setAutoCreateRowSorter(true);


            JPanel panel = new JPanel(new BorderLayout());
            panel.add(new JLabel(UIConstants.SEARCH), BorderLayout.WEST);
            JTextField searchFilter = SearchFilter.createRowFilter(tab);
            panel.add(searchFilter, BorderLayout.CENTER);
            panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

            tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            JScrollPane sp = new JScrollPane(tab,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
            panelParent.add(panel,BorderLayout.NORTH);
            panelParent.add(sp,BorderLayout.CENTER);
            panelParent.setBorder(BorderFactory.createEmptyBorder(10 , 10, 10, 10));
            cont.add(panelParent);
            this.pack();

                }

                public static void main(String[] args) {

                    EmployeeDAO dao = new EmployeeDAO();
                    List<EmployeeDTO> dto = dao.getemployeeData();

                    JFrame frame = new EmployeeDataWin(dto);
               }

            }

最佳答案

when i try to copy the entire row is getting selected I want to copy only the selected cell value instead of entire row

Ctrl+C 键的默认操作 是复制整行。如果您只需要当前选定单元格的数据,那么您需要将默认的 Action 替换为自定义 Action

逻辑如下:

Action copyCell = new AbstractAction()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JTable table = (JTable)e.getSource();
        int row = table.getSelectedRow();
        int column = table.getSelectedColumn();
        Object value = table.getValueAt(row, column);

        // copy the data to the clipboard

        Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
        StringSelection testData = new StringSelection( value.toString() );
        c.setContents(testData, testData);
    }
};

table.getActionMap().put("copy", copyCell);

上面的代码将创建自定义Action并将其替换在JTableActionMap中。请参阅Key Bindings 。链接中提供的程序显示了所有默认操作以及每个操作的关键字。

关于java - 如何使 JTable 单元格不可编辑,但应该能够选择并复制当前单元格中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60086679/

相关文章:

java - JPanels 在重叠期间闪烁

java - 如何让入侵者在java中从左向右移动

java - 如果父级正在调整大小或 JComponent 的内容正在更改,如何使 JComponent 始终填充父级事件?

java - 为什么在编辑 JTable 单元格时按转义键时不调用 cancelCellEditing()?

java - 改变JTable中一个单元格的背景颜色

java - 用 Java 编写分隔的 C++ Protobuf 消息和读取

java - maven 部署在 jre1.7 上失败

java - 是否有适合 Java 1.4 和 SE (Swing) 应用程序的优秀 DI 框架?

java - 在 java/gwt 中创建图形或图表?

java - 通过 JTable 删除 MySQL 数据库中的选定行