4

の列のペア間の仕切りとして空の列を使用しようとしていますJTable。ここに私がこれまでに持っているものの写真とコードがあります。custom を使用して外観を変更できることはわかっていますTableCellRenderer。その道を進む前に、これを行うより良い方法はありますか? どんなアイデアでも大歓迎です。

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

4 に答える 4

8

このアプローチの問題点として、ユーザーは仕切りの列を「タブオーバー」する必要があります。Table Tabbingの提案を使用して、よりユーザーフレンドリーにすることができます。

または、2 つのテーブル間のタブ移動が重要でない場合は、2 つのテーブルを使用して、2 つのテーブルの間に任意の仕切りを配置できます。選択モデルは、必要に応じて共有できます。

編集:

上で示唆したように、モデルの共有は、カスタム リスナーを作成するよりも簡単です。スクロールの同期を保つには、コードは次のようになります。

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

行の強調表示が同期されるように、選択モデルでも同じことを行うことができます。

于 2010-04-10T18:51:10.723 に答える
5

両方の答えを組み合わせたようなものです。スクロールバーを共有する2つのテーブルを使用しました。これはソートで機能し、実際にモデルを単純化します。タブ移動は問題ではありませんが、「A」と「B」を比較することは重要です。「モデル」の「ビュー」の問題を解決しようとしていたと思います。批判的なコメントをいただければ幸いです。

表パネル

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());
}
于 2010-04-12T15:49:57.967 に答える
2

この表に何を表示したいかを知らなければ、適切なソリューションを選択したかどうかを判断するのは困難です。

この解決策について。この列は仕切りのようには見えません。グレー/別の色でペイントするか、仕切りヘッダー セルを白でペイントします。

しかし、とにかく、このソリューションの代わりに JScrollPane + その中に 2 つのテーブルを使用したいと思います。

于 2010-04-10T18:48:44.543 に答える
1

この質問の回答をご覧ください。いくつかの素晴らしい新しい提案がありました: JTable または JXTable の列分割線

于 2012-01-03T21:34:40.223 に答える