how to manipulate JTable return value on specified column?

前端 未结 1 928
盖世英雄少女心
盖世英雄少女心 2021-01-26 06:45

I have a JTable that has two columns (editable JTable). When a user types something in the second column, my requirement is as follows:

  • user can only

相关标签:
1条回答
  • 2021-01-26 07:15

    Implement a TableCellEditor that is capable of returning a text component (JTextField) that has a DocumentFilter attached to it capable of filtering the incoming text as you require.

    You might like to take a look at

    • Limit the Characters in the text field using document listner
    • MDP's Weblog
    • accept only a single digit in java
    • Text Component Features (look for "Implementing a Document Filter")

    UPDATED with example

    if it jtextfield it need document filter or plain document etc, if it JTable, then how?

    Read the tutorials, ask questions specific to the problem you're having. It's important that you understand why things are done in a certain way rather then simply copying and pasting some one else code, otherwise you won't know when you're copying bad ideas ;)

    public class TestFilteredCellEditor {
    
        public static void main(String[] args) {
            new TestFilteredCellEditor();
        }
    
        public TestFilteredCellEditor() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException ex) {
                    } catch (InstantiationException ex) {
                    } catch (IllegalAccessException ex) {
                    } catch (UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new FilteredEditorPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class FilteredEditorPane extends JPanel {
    
            public FilteredEditorPane() {
                setLayout(new BorderLayout());
                JTable table = new JTable(new MyTableModel());
                TableColumnModel columnModel = table.getColumnModel();
                columnModel.getColumn(1).setCellEditor(new FilteredTableEditor());
                add(new JScrollPane(table));
            }
        }
    
        public class FilteredTableEditor extends AbstractCellEditor implements TableCellEditor {
    
            private JTextField editor;
    
            public FilteredTableEditor() {
                editor = new JTextField();
                ((AbstractDocument) editor.getDocument()).setDocumentFilter(new NumericDocumentFilter());
            }
    
            @Override
            public boolean isCellEditable(EventObject e) {
                return true;
            }
    
            @Override
            public Object getCellEditorValue() {
                return editor.getText();
            }
    
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
                if (value instanceof String) {
                    editor.setText((String) value);
                } else {
                    editor.setText(null);
                }
                return editor;
            }
        }
    
        public class NumericDocumentFilter extends DocumentFilter {
    
            public void insertString(DocumentFilter.FilterBypass fb, int offset,
                    String string, AttributeSet attr)
                    throws BadLocationException {
    
                StringBuilder buffer = new StringBuilder(string);
                boolean isBad = false;
                for (int i = buffer.length() - 1; i >= 0; i--) {
                    char ch = buffer.charAt(i);
                    if (!Character.isDigit(ch)) {
                        buffer.deleteCharAt(i);
                        isBad = true;
                    }
                }
                if (isBad) {
                    Toolkit.getDefaultToolkit().beep();
                }
                super.insertString(fb, offset, buffer.toString(), attr);
            }
    
            public void replace(DocumentFilter.FilterBypass fb,
                    int offset, int length, String string, AttributeSet attr) throws BadLocationException {
                if (length > 0) {
                    fb.remove(offset, length);
                }
                insertString(fb, offset, string, attr);
            }
        }
    
        public class MyTableModel extends AbstractTableModel {
    
            @Override
            public int getRowCount() {
                return 1;
            }
    
            @Override
            public int getColumnCount() {
                return 2;
            }
    
            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                return "";
            }
    
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return true;
            }
    
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return String.class;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题