Domanda

Sto cercando di utilizzare una colonna vuota come divisorio tra coppie di colonne in una JTable. Ecco una foto e un codice per quello che ho finora. So di poter cambiare il look con un TableCellRenderer personalizzato. Prima di andare su questa strada, c'è un modo migliore per fare questo? Tutte le idee hanno apprezzato.

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;
        }
    }
}
È stato utile?

Soluzione

Il problema di questo approccio è che l'utente avrà bisogno di "scheda over" la colonna divisore. È possibile utilizzare il Tabella Tabbing suggerimento per renderlo più user friendly.

Se la tabulazione tra le due tabelle non è importante, allora forse si può usare Uso due tavoli e mettere quello che vuoi divisore betweeen i due. Il modello di selezione può condivisa se necessario.

Modifica:

Come ho suggerito sopra la condivisione di modelli è più facile che scrivere listener personalizzati. Per mantenere lo scorrimento in sincronia il codice sarebbe:

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

Si può anche fare lo stesso con il modello di selezione in modo che evidenziazione di righe è in sincronia.

Altri suggerimenti

I tipi di combinati entrambe le risposte: ho usato due tabelle che la quota di una barra di scorrimento. Questo funziona con l'ordinamento, e in realtà rende il modello più semplice. Tabulazione non importa, ma confrontando "A" e "B" fa. Penso che stavo cercando di risolvere un problema "vista" nel "modello". Ho fatto questo una risposta a parte, perché mi farebbe piacere eventuali commenti critici.

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

Senza sapere che cosa si desidera mostrare in questa tabella è difficile dire se è stato selezionato buona soluzione oppure no.

Per quanto riguarda questa soluzione. Questa colonna non sembra un divisore. Paint it con il grigio / un altro colore, o dipingere divisore cella di intestazione di bianco.

Ma in ogni caso preferirei JScrollPane + due tavoli all'interno, invece di questa soluzione.

Si prega di dare un'occhiata alla risposta di questa domanda, qualche bel nuovo suggerimento è stato dato c'è: divisori di colonna in JTable o JXTable

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top