Usando una columna vacía como un divisor en un JTable
Pregunta
Estoy tratando de utilizar una columna vacía como un divisor entre pares de columnas en una JTable
. Aquí está una imagen y el código para lo que tengo hasta ahora. Sé que puedo cambiar el aspecto utilizando un TableCellRenderer
personalizado. Antes de ir por ese camino, hay una mejor manera de hacer esto? aprecia Cualquier ideas.
import javax.swing.*;
import javax.swing.table.*;
public class TablePanel extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("TablePanel");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.add(new TablePanel());
f.pack();
f.setVisible(true);
}
});
}
public TablePanel() {
TableModel dataModel = new MyModel();
JTable table = new JTable(dataModel);
table.getColumnModel().getColumn(MyModel.DIVIDER).setMaxWidth(0);
JScrollPane jsp = new JScrollPane(table);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(jsp);
}
private static class MyModel extends AbstractTableModel {
private static final int DIVIDER = 2;
private final String[] names = { "A1", "A2", "", "B1", "B2" };
@Override
public int getRowCount() {
return 32;
}
@Override
public int getColumnCount() {
return names.length;
}
@Override
public String getColumnName(int col) {
if (col == DIVIDER) return "";
return names[col];
}
@Override
public Object getValueAt(int row, int col) {
if (col == DIVIDER) return "";
return (row + 1) / 10.0;
}
@Override
public Class<?> getColumnClass(int col) {
if (col == DIVIDER) return String.class;
return Number.class;
}
}
}
Solución
El problema con este enfoque es que será necesario que el usuario "ficha sobre" la columna de la divisoria. Se podría utilizar el Tabla Tabbing sugerencia para que sea más fácil de usar.
O si tabulación entre las dos tablas no es importante, entonces tal vez usted puede usar Utilice dos mesas y poner lo divisor desea betweeen los dos. El modelo de selección puede compartir si es necesario.
Editar:
Como he sugerido anteriormente compartir modelos es más fácil que escribir oyentes personalizados. Para mantener el desplazamiento sincronizado el código sería:
jspa.getVerticalScrollBar().setModel( jspb.getVerticalScrollBar().getModel() );
También puede hacer lo mismo con el modelo de selección de manera que destacar de filas está en sincronía.
Otros consejos
Me tipo de combinados ambas respuestas: Me utiliza dos tablas que comparten barra de desplazamiento de uno. Esto funciona con la clasificación, y que en realidad hace que el modelo más simple. Tabulación no importa, pero la comparación de "A" y "B" hace. Creo que estaba tratando de resolver un problema "vista" en el "modelo". Hice este una respuesta por separado, debido a lo agradecería cualquier comentario crítico.
public TablePanel() {
this.setLayout(new GridLayout(1, 0, 8, 0));
JTable tableA = new JTable(new MyModel("A"));
tableA.setPreferredScrollableViewportSize(new Dimension(200, 400));
final JScrollPane jspA = new JScrollPane(tableA);
jspA.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
this.add(jspA);
JTable tableB = new JTable(new MyModel("B"));
tableB.setPreferredScrollableViewportSize(new Dimension(200, 400));
final JScrollPane jspB = new JScrollPane(tableB);
jspB.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(jspB);
tableA.setSelectionModel(tableB.getSelectionModel());
jspA.getVerticalScrollBar().setModel(jspB.getVerticalScrollBar().getModel());
}
Sin saber qué es lo que desea mostrar en esta tabla es difícil decir si se ha seleccionado o no buena solución.
En cuanto a esta solución. Esta columna no se parece como un divisor. La pintura es de color gris / otro color, o pintar divisor de celda de encabezado en blanco.
Pero de todos modos yo preferiría JScrollPane + dos mesas en su interior en lugar de esta solución.
Por favor, eche un vistazo a la respuesta de esta pregunta, algunos agradables nueva sugerencia fue dada allí: divisores de columna en JTable o JXTable