Je faisais face au même problème et quand essayé de chercher la raison pour laquelle j'ai eu cette question, mais il semble que ce soit un bug dans Java SDK. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4276786
AUTOUR DE TRAVAIL
Un travail autour temporaire est disponible. Il devrait être supprimé une fois que ce bogue a été corrigé car il n'a PAS été testé par rapport aux versions corrigées.
Utilisez cette sous-classe de JTable.
Remarque: Ceci est pour le MetalLookAndFeel. Si vous utilisez d'autres aspects, la sous-classe FixedTableUI interne devra étendre la sous-classe TableUI pour ce look and feel.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.swing.plaf.basic.*;
public class FixedTable extends JTable {
private boolean isControlDownInDrag;
public FixedTable(TableModel model) {
super(model);
setUI(new FixedTableUI());
}
private class FixedTableUI extends BasicTableUI {
private MouseInputHandler handler = new MouseInputHandler() {
public void mouseDragged(MouseEvent e) {
if (e.isControlDown()) {
isControlDownInDrag = true;
}
super.mouseDragged(e);
}
public void mousePressed(MouseEvent e) {
isControlDownInDrag = false;
super.mousePressed(e);
}
public void mouseReleased(MouseEvent e) {
isControlDownInDrag = false;
super.mouseReleased(e);
}
};
protected MouseInputListener createMouseInputListener() {
return handler;
}
}
public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) {
if (isControlDownInDrag) {
ListSelectionModel rsm = getSelectionModel();
ListSelectionModel csm = getColumnModel().getSelectionModel();
int anchorRow = rsm.getAnchorSelectionIndex();
int anchorCol = csm.getAnchorSelectionIndex();
boolean anchorSelected = isCellSelected(anchorRow, anchorCol);
if (anchorSelected) {
rsm.addSelectionInterval(anchorRow, rowIndex);
csm.addSelectionInterval(anchorCol, columnIndex);
} else {
rsm.removeSelectionInterval(anchorRow, rowIndex);
csm.removeSelectionInterval(anchorCol, columnIndex);
}
if (getAutoscrolls()) {
Rectangle cellRect = getCellRect(rowIndex, columnIndex, false);
if (cellRect != null) {
scrollRectToVisible(cellRect);
}
}
} else {
super.changeSelection(rowIndex, columnIndex, toggle, extend);
}
}
}
Remarque Curtsey à http://bugs.sun.com
méfiez-vous: faire pourrait se retourner contre - un dataChanged peut inclure des insertions/suppressions. Si c'est le cas, les auditeurs pourraient être gravement induits en erreur. – kleopatra
Cela ne serait-il pas une structureChanged alors? –
non, une structureChanged est lorsque les colonnes sont modifiées avec les données – kleopatra