Tuve el mismo problema, y estaba buscando al respecto. Hasta ahora he encontrado dos formas de hacerlo.
- El "si estaba reescribiendo yo mismo" método: Modificación de las clases base de Java.
TableColumn
necesitaría una nueva propiedad, como el "resizingAllowed", necesitaría el "reorderingAllowed". partir de esto, las modificaciones se realizan en BasicTableHeaderUI
:
Ya existe:
private static boolean canResize(TableColumn column,
JTableHeader header) {
return (column != null) && header.getResizingAllowed()
&& column.getResizable();
}
Se necesitaría demasiado:
private static boolean canMove(TableColumn column,
JTableHeader header) {
return (column != null) && header.getReorderingAllowed()
&& column.getReorderable();
}
(Tenga en cuenta que si usted no desea que la primera columna solo para no moverse, puede hacerlo sin cambiar las columnas de tabla:
private static boolean canMove(TableColumn column,
JTableHeader header) {
return (column != null) && header.getReorderingAllowed()
&& header.getColumnModel().getColumnIndex(column.getIdentifier()) != 0;
}
)
Después, dos lugares para modificar en el MouseInputListener
:
- en el
mousePressed
, llamando a la canMove()
en lugar de la header.getReorderingAllowed()
. Esto asegura que no se moverá una columna que no se debe mover.
Pero esto no es suficiente, debemos evitar que las columnas inmóviles se muevan durante el arrastre de otra. Es necesario cambiar la mouseDragged
, también, cuando se está haciendo el "newColumnIndex":
si (0 < newColumnIndex & & newColumnIndex < cm.getColumnCount())
Es necesario añadir la condición si este nuevo índice se puede mover, por ejemplo, utilizando el método "canMove()". De esta manera, cuando arrastres una columna a esta inmóvil, aún la arrastrarás, pero no la intercambiará.
Tenga en cuenta que este método requerirá que configure explícitamente la interfaz de usuario para el JTableHeader utilizado para su JTable, que en realidad no es ideal. Pero este es el más adecuado, ya que trata el problema en el lugar donde se supone que debe hacerlo.
- El "Vamos a tratar de bloquear el comportamiento normal con lo que en realidad tenemos" método: No modificar la interfaz de usuario, este método de enfoque en la JTableHeader para bloquear los comandos realizados por la interfaz de usuario.
En primer lugar, para bloquear arrastrando la primera columna, necesitamos una subclase de JTableHeader, con este método reemplazado:
@Override
public void setDraggedColumn(TableColumn pAColumn)
{
int lIndex = -1;
if (pAColumn != null)
lIndex = getColumnModel().getColumnIndex(pAColumn.getIdentifier());
if (lIndex != 0)
super.setDraggedColumn(pAColumn);
}
Esto evitará que un usuario de arrastrar la primera columna. Pero como se describió anteriormente, esta es solo una parte del problema, debemos evitar que otra columna arrastrada se intercambie con esta primera.
Hasta ahora, no tengo un método correcto para esto. Me trató como subclase la TableColumnModel, y reemplazando el método moveColumn()
:
@Override
public void moveColumn(int pColumnIndex, int pNewIndex)
{
//Move only if the first column is not concerned
if (pColumnIndex =! 0 && pNewIndex != 0)
super.moveColumn(pColumnIndex, pNewIndex);
}
Pero esto no funcionará, ya que la interfaz de usuario se actualizará todos modos la posición del ratón en el método mouseDragged
, tendrá un salto desde su columna arrastrado a otro lugar
Todavía estoy buscando, y me pregunto si alguien tiene proposiciones sobre esta parte.
Recibí el 70% de su pregunta y comencé a escribir una respuesta diciéndole que use 2 tablas ... Luego terminé de leer su publicación. – jjnguy
¿Entonces está diciendo que la primera columna debería ser independiente de las demás? –
Habla de mover columnas enteras, izquierda y derecha. – jjnguy