0

Hello I have a simple JTable, there are six columns that matter have header described in Table Model:

private final String[] columNames = new String[]{"Id","TicketID","PolicyNo","Remarks 1","Hourly Rate","Part Time","Validate 1"};

I need to validate each time user enters 3 digits that must be equal based on last 3 digits value from Column (2). Please see the picture below Run File

this is my code

private final DefaultTableCellRenderer renderer = new TabelaCellRenderer();

/**
 * Creates new form EditableTableExample
 */
public EditableTableExample() {
    initComponents();
    setLocationRelativeTo(null);
    setTitle("Editable Table Example");
    initTable();
}

private void initTable(){
    DocsDetail row1 = new DocsDetail(1, "1216266","19889086","", 100.0, true,0);
    DocsDetail row2 = new DocsDetail(1, "1216266","33350761","", 100.0, false,0);
    DocsDetail row3 = new DocsDetail(1, "1216266","22780770","", 100.0, true,0);
    DocsDetail row4 = new DocsDetail(1, "1216266","57611607","", 100.0, false,0);
    DocsDetail row5 = new DocsDetail(1, "1216266","72914755","", 100.0, true,0);

    //build the list
    List<DocsDetail> employeeList = new ArrayList<>();
    employeeList.add(row1);
    employeeList.add(row2);
    employeeList.add(row3);
    employeeList.add(row4);
    employeeList.add(row5);

    //create the model
    DocsDetailTabelModel model = new DocsDetailTabelModel(employeeList);
    //create the table
    tableEx.setModel(model);
    tableEx.setRowSorter(new TableRowSorter(model));
    //tableEx.setDefaultRenderer(Object.class, renderer);
    //tableEx.getColumnModel().getColumn(6).setCellEditor(new IntegerEditor(0, 1000));
}

private class TabelaCellRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column);
        String nopolis = "";
        int lastDigits = 0;
        int modelRow = jtable.convertRowIndexToView(row);
        jtable.convertRowIndexToView(row);
        nopolis = jtable.getModel().getValueAt(modelRow, 2).toString();
        lastDigits = Integer.parseInt(nopolis.substring(nopolis.length() - 3));
        if (column == 6) {
            if(!value.equals(0)){
                System.out.println("lastDigits: "+lastDigits);
                if (value.equals(lastDigits)) {
                   jtable.setCellSelectionEnabled(true);
                    setFont(getFont().deriveFont(Font.BOLD));
                } else {
                   jtable.setCellSelectionEnabled(false);
                   setFont(getFont().deriveFont(Font.PLAIN));
                }
            }
        }else {
            setForeground(Color.black);
            setFont(getFont().deriveFont(Font.PLAIN));
        }
        return this;
    }
}

Looks pretty simple(or not simple hehe). Except that I have no idea what event should I look for. Something like "cell value changed"? or Cell Validator or Cell Renderer, i already try those methods but i did not find solution for my case ;( Anyway, before I come up with some weird noobish solution I thought I might ask here what's the proper way to do it :)

1 Answers1

0

You need to create a custom editor to edit the data as it is being entered.

Check out the Table Five Character Editor for an example to get you started.

The example there just makes sure you enter 5 characters in the cell. You would obviously change the edit to validate the 3 characters entered.

Community
  • 1
  • 1
camickr
  • 321,443
  • 19
  • 166
  • 288