Question

I essaie d'utiliser une colonne vide comme séparateur entre des paires de colonnes dans un JTable. Voici une photo et un code pour ce que j'ai jusqu'à présent. Je sais que je peux changer l'apparence à l'aide d'un TableCellRenderer personnalisé. Avant que je descends cette route, est-il une meilleure façon de le faire? Toutes les idées ont apprécié.

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;
        }
    }
}
Était-ce utile?

La solution

Le problème avec cette approche, il que l'utilisateur devra « onglet sur » la colonne diviseur. Vous pouvez utiliser la table Tabulation suggestion pour le rendre plus convivial.

Ou si entre les deux tabulant tables n'est pas important, vous pouvez peut-être utiliser l'utilisation de deux tables et mettez ce que vous voulez diviseur betweeen les deux. Le modèle de sélection peut partager si nécessaire.

Edit:

Comme je l'ai suggéré plus haut modèles de partage est plus facile que d'écrire les auditeurs personnalisés. Pour garder le défilement synchronisé le code serait:

jspa.getVerticalScrollBar().setModel( jspb.getVerticalScrollBar().getModel() );

Vous pouvez également faire la même chose avec le modèle de sélection de sorte que la mise en évidence de lignes est en phase.

Autres conseils

Je genre de combiné les deux réponses: J'ai utilisé deux tables qui partagent sa barre de défilement. Cela fonctionne avec le tri, et il est en fait le modèle plus simple. Tabbing n'a pas d'importance, mais la comparaison « A » et « B » fait. Je pense que je tentais de résoudre un problème « vue » dans le « modèle ». Je l'ai fait une réponse distincte, parce que je vous en serais reconnaissant des commentaires critiques.

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());
}

Sans savoir ce que vous voulez montrer dans ce tableau, il est difficile de dire si vous avez sélectionné la bonne solution ou non.

En ce qui concerne cette solution. Cette colonne ne semble pas comme un diviseur. Peindre avec gris / une autre couleur, ou une cellule d'en-tête de division de la peinture blanche.

Mais de toute façon je préfère JScrollPane + deux tables à l'intérieur au lieu de cette solution.

S'il vous plaît jeter un oeil à la réponse de cette question, une nouvelle bonne suggestion a été donnée là:

scroll top