public static void main(String[] pArgs) {
    try {
      TableViewColumn[] columns =
        {
          new DefaultTableViewColumn(
            "Name",
            Row.class.getDeclaredMethod("getName", null),
            Row.class.getDeclaredMethod("setName", new Class[] {String.class})),
          new DefaultTableViewColumn(
            "Description",
            Row.class.getDeclaredMethod("getDescription", null),
            Row.class.getDeclaredMethod("setDescription", new Class[] {String.class})),
          new DefaultTableViewColumn(
            "Number",
            Row.class.getDeclaredMethod("getNumber", null),
            Row.class.getDeclaredMethod("setNumber", new Class[] {Integer.class})),
          new DefaultTableViewColumn(
            "Data",
            Row.class.getDeclaredMethod("getData", null),
            Row.class.getDeclaredMethod("setData", new Class[] {String.class})),
          new DefaultTableViewColumn(
            "Create",
            Row.class.getDeclaredMethod("getCreate", null),
            Row.class.getDeclaredMethod("setCreate", new Class[] {Date.class}))
      };

      Row[] rows =
        {
          new Row("toto", "This is my toto", 1, "Hello", new Date(1000000000000L)),
          new Row("ooo", "This is my ooo", 1, "999", new Date(1000000000000L)),
          new Row("aaa", "This is my aaa", 1, "888", new Date(200000000000L)),
          new Row("bbb", "This is my bbb", 1, "777", new Date(300000000000L)),
          new Row("ccc", "This is my ccc", 1, "666", new Date(400000000000L)),
          new Row("ddd", "This is my ddd", 1, "555", new Date(500000000000L)),
          new Row("eee", "This is my eee", 1, "444", new Date(600000000000L)),
          new Row("fff", "This is my fff", 1, "333", new Date(700000000000L)),
          new Row("ggg", "This is my ggg", 1, "222", new Date(800000000000L)),
          new Row("hhh", "This is my hhh", 1, "111", new Date(900000000000L))};

      final DefaultTableViewModel model = new DefaultTableViewModel(columns, Arrays.asList(rows));

      for (int i = 0 ; i < 20000 ; i++) {
        model.addRow(new Row("" + 1, "This is my " + i, 1, "" + (20000 - i), new Date()));
      }

      JFrame frame = new JFrame();
      final TableView view = new TableView(model);
      view.setMakeIndex(true);
      frame.getContentPane().setLayout(new BorderLayout());
      frame.getContentPane().add(new JScrollPane(view), BorderLayout.CENTER);

      JPanel panelBtn = new JPanel();
      JButton btnNew = new JButton("Add");
      JButton btnRemove = new JButton("Remove");
      btnNew.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent pEvent) {
          List selection = view.getSelectedRowObjects();
          model.addRow(new Row("New row", "This is s new row", 1, "Data of new row", new Date()));
          view.addRowSelection(selection);
        }
      });
      btnRemove.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent pEvent) {
          List selection = view.getSelectedRowObjects();
          model.removeRows(selection);
        }
      });

      panelBtn.setLayout(new GridLayout(2, 1));
      panelBtn.add(btnNew);
      panelBtn.add(btnRemove);
      frame.getContentPane().add(panelBtn, BorderLayout.EAST);

      frame.setSize(600, 400);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.validate();
      frame.setVisible(true);
    }
    catch (Exception e) {
      e.printStackTrace();
      System.exit(-1);
    }
  }