Re: ListSelectionListener valueChanged fired twice
I could not reproduce the problem. Here is the test case.
package test.list.bug;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class TableRowModelListener implements ListSelectionListener {
private JTable table;
public TableRowModelListener(JTable table) {
this.table = table;
}
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
System.err
.println("INSIDE THE ROW SELECTION CHANGED METHOD.............");
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
if (!lsm.isSelectionEmpty()) {
System.out.println("List selection is not empty");
}
}
}
}
package test.list.bug;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
class TableEdit implements ActionListener {
JTable table;
MyTableModel model;
TableEdit()
{
JFrame frame = new JFrame("Editing Test");
frame.setBounds(10,10,750,550);
model = new MyTableModel();
table = new MyTable(model);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoCreateColumnsFromModel(false);
table.setSurrendersFocusOnKeystroke(true);
table.setCellSelectionEnabled(true);
table.setColumnSelectionAllowed(true);
table.setRowSelectionAllowed(true);
ListSelectionModel rowSelection = table.getSelectionModel();
TableRowModelListener rowListener = new
TableRowModelListener(table);
rowSelection.addListSelectionListener(rowListener);
Container c = frame.getContentPane();
JScrollPane scrollpane = new JScrollPane(table);
c.add(scrollpane, BorderLayout.CENTER);
JButton loadAnotherTable = new JButton("Load");
loadAnotherTable.addActionListener(this);
c.add(loadAnotherTable, BorderLayout.SOUTH);
frame.setVisible(true);
}
public static void main(String [] args)
{
TableEdit appln = new TableEdit();
}
public void actionPerformed(ActionEvent e) {
}
}
package test.list.bug;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
public class MyTableModel extends AbstractTableModel {
private Vector vector;
private String[] columnNames = { "#", "Number" };
public static final int COL_NUMBER = 0;
public static final int COL_MY_NUMBER = 1;
public MyTableModel() {
super();
vector = new Vector();
for (int i = 0; i < 5; i++) {
vector.addElement(new MyModel(Integer.toString(i)));
}
}
// This method creates a new table
public void tableChanged(ArrayList list) {
vector.clear();
for (int i = 0; i < list.size(); i++) {
MyModel element = (MyModel) list.get(i);
vector.addElement(element);
}
this.fireTableRowsInserted(0, list.size());
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
if (vector != null)
return vector.size();
return 0;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int nRow, int nCol) {
if (nRow < 0 || nRow >= getRowCount())
return "";
MyModel row = (MyModel) vector.elementAt(nRow);
switch (nCol) {
case COL_NUMBER:
return String.valueOf(nRow + 1);
case COL_MY_NUMBER:
return row.getNumber();
}
return "";
}
public void setValueAt(Object value, int nRow, int nCol) {
if (nRow < 0 || nRow >= getRowCount() || value == null)
return;
MyModel row = (MyModel) vector.elementAt(nRow);
String svalue = value.toString();
switch (nCol) {
case COL_MY_NUMBER:
if(svalue != null || svalue.length() > 0) {
row.setNumber(svalue);
}
break;
}
fireTableCellUpdated(nRow, nCol);
}
public Class getColumnClass(int column) {
Class dataType = getValueAt(0, column).getClass();
return dataType;
}
public boolean isCellEditable(int row, int col) {
return true;
}
}
package test.list.bug;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import javax.swing.text.JTextComponent;
public class MyTable extends JTable {
public MyTable(TableModel dm) {
super(dm);
}
public MyTable(Object[][] o, String[] s) {
super(o, s);
}
public Component prepareEditor(TableCellEditor editor, int row, int
col) {
JTextComponent comp = (JTextComponent) super.prepareEditor(editor,
row,
col);
comp.setText(null);
return comp;
}
public void changeSelection(int row, int column, boolean toggle,
boolean extend) {
if (!isEditing())
super.changeSelection(row, column, toggle, extend);
}
}
package test.list.bug;
import java.io.Serializable;
public class MyModel implements Serializable {
private String number;
public MyModel(String number) {
this.number = number;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
Thanks for the help. The problem was somewhere else.