-
Bug
-
Resolution: Duplicate
-
P4
-
None
-
1.2.2, 1.3.0
-
generic, x86
-
generic, windows_nt
Name: md23716 Date: 09/04/2000
When selecting a cell in a JTable using 'control-click',
the selected cells are alternately highlighted and reset.
For example, if 5 cells are already highlighted, and a
6th is selected with ctrl-click, then the highlighting
disappears for all 6 cells. If a 7th cell is then selected
with a further ctrl-click, then all 7 cells become
highlighted, and so on.
This behaviour is the same on 1.3 and 1.4beta
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.JScrollPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.JOptionPane;
import java.awt.*;
import java.awt.event.*;
import java.util.EventObject.*;
public class TableDemo extends JFrame
{
private boolean DEBUG = true;
public TableDemo()
{
super("TableDemo");
MyTableModel myModel = new MyTableModel();
JTable table = new JTable(myModel);
table.setPreferredScrollableViewportSize(new Dimension(500, 500));
table.setCellSelectionEnabled(true); //<-- causes non-contiguous selectio
n problem
table.setRowSelectionAllowed(true);
table.setColumnSelectionAllowed(false);
table.setAutoResizeMode(0);
// table.setShowHorizontalLines(false);
// System.out.println(table.AccessibleJTable.AccessibleJTableCell.isFocusT
raversable());
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.createHorizontalScrollBar();
//Add the scroll pane to this window.
getContentPane().add(scrollPane, BorderLayout.CENTER);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
class MyTableModel extends AbstractTableModel
{
final String[] columnNames = {
"One",
"Two",
"Three",
"Four",
"Five",
"Six",
"Seven",
"Eght",
"Nine",
"Ten",
"Eleven",
"Eleven"
};
final Object[][] data = {
{"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
{"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
{"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
{"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
{"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
{"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
{"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)}
};
public int getColumnCount()
{
return columnNames.length;
}
public int getRowCount()
{
return data.length;
}
public String getColumnName(int col)
{
return columnNames[col];
}
public Object getValueAt(int row, int col)
{
return data[row][col];
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c)
{
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col)
{
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2)
{
return false;
}
else
{
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col)
{
if (DEBUG)
{
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}
if (data[0][col] instanceof Integer)
{
//If we don't do something like this, the column
//switches to contain Strings.
//XXX: See TableEditDemo.java for a better solution!!!
try
{
data[row][col] = new Integer((String)value);
fireTableCellUpdated(row, col);
}
catch (NumberFormatException e)
{
JOptionPane.showMessageDialog(TableDemo.this,
"The \"" + getColumnName(col)
+ "\" column accepts only integer v
alues.");
}
}
else
{
data[row][col] = value;
fireTableCellUpdated(row, col);
}
if (DEBUG)
{
System.out.println("New value of data:");
}
}
private void printDebugData()
{
int numRows = getRowCount();
int numCols = getColumnCount();
for (int i=0; i < numRows; i++)
{
System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++)
{
System.out.print(" " + data[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
}
}
public static void main(String[] args)
{
TableDemo frame = new TableDemo();
frame.pack();
frame.setVisible(true);
}
}
======================================================================
- duplicates
-
JDK-4314209 JTable: cell-[range-]selection problems in kestrel-rc1 (see SwingSet2)
-
- Resolved
-