Frage

Ich versuche, eine leere Spalte als Teiler zwischen Paaren von Spalten in einer JTable zu verwenden. Hier ist ein Bild und den Code für das, was ich bisher haben. Ich weiß, ich kann das Aussehen eines benutzerdefinierten TableCellRenderer verwenden. Bevor ich diesen Weg gehen, gibt es einen besseren Weg, dies zu tun? Irgendwelche Ideen geschätzt.

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

Andere Tipps

I Art kombinierten beide Antworten: habe ich zwei Tabellen, die Aktie zu einem der Scrollbar. Dies funktioniert mit Sortierung, und es macht tatsächlich das Modell einfacher. Tabbing spielt keine Rolle, sondern „A“ und „B“ macht den Vergleich. Ich glaube, ich habe versucht, ein „Ansicht“ Problem in dem „Modell“ zu lösen. Ich habe dies eine separate Antwort, weil ich keine kritischen Anmerkungen schätzen würde.

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

Ohne zu wissen, was Sie in dieser Tabelle zeigen wollen, ist es schwer zu sagen, ob Sie eine gute Lösung ausgewählt haben oder nicht.

In Bezug auf diese Lösung. Diese Spalte scheint nicht wie ein Teiler. Malen Sie es mit grau / einer anderen Farbe oder Lack Teiler Kopfzelle in weiß.

Aber trotzdem würde ich JScrollPane + zwei Tische im Inneren statt dieser Lösung bevorzugen.

haben Sie einen Blick auf die Antwort auf diese Frage wurde einige schöne neue Vorschlag dort gegeben:

scroll top