簡體   English   中英

如何使 JTable 單元格不可編輯但應該能夠選擇和復制當前單元格中的值

[英]how to make JTable cell non editable but should be able to select and copy the value in current cell

我試圖使 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);
               }

            }

當我嘗試復制整行被選中時,我只想復制選定的單元格值而不是整行

Ctrl+C鍵的默認Action是復制整行。 如果您只想要當前選定單元格的數據,則需要將默認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中替換它。 請參閱鍵綁定 鏈接中提供的程序顯示了所有默認操作和每個操作的關鍵字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM