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.

TablePanel.png

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;
        }
    }
}
¿Fue útil?

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.

TablePanel

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top