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

Java 如何使JTable单元格不可编辑,但应能够选择和复制当前单元格中的值,java,swing,jtable,awt,tablecelleditor,Java,Swing,Jtable,Awt,Tablecelleditor,我试图使JTable单元格不可编辑,但如果我这样做,当我试图复制整行时,我将无法选择单个单元格值 我只想复制选定的单元格值,而不是整行。有没有办法 public class EmployeeWin extends JFrame { DefaultTableModel model = new DefaultTableModel() { @Override public boolean isCellEditable(int row,

我试图使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);
               }

            }
公共类EmployeeWin扩展JFrame{
DefaultTableModel=新的DefaultTableModel(){
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
};
Container cont=this.getContentPane();
JTable tab=新的JTable(模型);
专用TableRowSorter rowSorter=新的TableRowSorter(型号);
私有最终JTextField searchFilter=新JTextField();
公共EmpDataWin(列表PEMPloyedTo){
初始化(pemployedto);
}
公共无效初始化(列表PEMPloyedToList){
JPanel panelParent=newjpanel(newborderlayout());
//添加标题
model.addColumn(“员工姓名”);
模型。添加栏(“部门”);
模型。添加列(“详细信息”);
//将数据行添加到表中
适用于(员工人数至aEmployeeDTO:pEmployeeDTOList){
model.addRow(新对象[]{aEmployeeDTO.getEmployee_Name(),aEmployeeDTO.getDepartment(),
aemployedto.getDetails()});
}
tab.设置行分拣机(行分拣机);
tab.setAutoCreateRowSorter(真);
JPanel panel=newjpanel(newborderlayout());
panel.add(新的JLabel(UIConstants.SEARCH),BorderLayout.WEST);
JTextField searchFilter=searchFilter.createRowFilter(选项卡);
panel.add(searchFilter,BorderLayout.CENTER);
panel.setBorder(BorderFactory.createEmptyByOrder(10,10,10,10));
tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane sp=新的JScrollPane(选项卡,ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS,ScrollPaneConstants.HORIZONTAL\u SCROLLBAR\u ALWAYS);
panelParent.add(panel,BorderLayout.NORTH);
panelParent.add(sp,BorderLayout.CENTER);
panelParent.setBorder(BorderFactory.CreateEmptyByOrder(10,10,10,10));
继续添加(家长);
这个包();
}
公共静态void main(字符串[]args){
EmployeeDAO=新员工dao();
List dto=dao.getemployeeData();
JFrame=新员工数据(dto);
}
}
当我尝试复制整行时,我希望只复制选定的单元格值,而不是整行

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

逻辑应该是这样的:

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);

上述代码将创建自定义
操作
,并将其替换到
JTable
ActionMap
中。看见链接中提供的程序显示了所有默认操作和每个操作的关键字。

添加一个
jpopmpmenu
(使用相同的
操作
),您就有了一个甜蜜的解决方案