Использование пустого столбца в качестве разделителя в JTable - PullRequest
4 голосов
/ 10 апреля 2010

Я пытаюсь использовать пустой столбец в качестве разделителя между парами столбцов в JTable. Вот картинка и код того, что у меня пока есть. Я знаю, что могу изменить внешний вид, используя пользовательский TableCellRenderer. Прежде чем я пойду по этому пути, есть ли лучший способ сделать это? Любые идеи приветствуются.

TablePanel.png http://i42.tinypic.com/1zxpfkj.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 ]

8 голосов
/ 10 апреля 2010

По проблеме с этим подходом это то, что пользователю нужно будет «перебрать» столбец делителя. Вы можете использовать предложение Table Tabbing , чтобы сделать его более удобным для пользователя.

Или, если табуляция между двумя таблицами не важна, тогда, возможно, вы можете использовать две таблицы и установить любой делитель между двумя. Модель выбора может быть предоставлена ​​в случае необходимости.

Edit:

Как я уже говорил выше, совместное использование моделей проще, чем написание пользовательских слушателей. Чтобы синхронизировать прокрутку, код должен быть:

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

Вы также можете сделать то же самое с моделью выбора, чтобы подсветка строк синхронизировалась.

5 голосов
/ 12 апреля 2010

Я как бы объединил оба ответа: я использовал две таблицы, которые используют одну полосу прокрутки. Это работает с сортировкой и фактически упрощает модель. Вкладка не имеет значения, но сравнение «А» и «В» имеет значение. Я думаю, что я пытался решить проблему «взгляда» в «модели». Я сделал это отдельным ответом, потому что я буду благодарен за любые критические замечания.

TablePanel http://i41.tinypic.com/2uqdtmo.png

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());
}
2 голосов
/ 10 апреля 2010

Не зная, что вы хотите показать в этой таблице, трудно сказать, выбрали ли вы хорошее решение или нет.

Относительно этого решения. Этот столбец не похож на разделитель. Нарисуйте его серым / другим цветом или закрасьте ячейку заголовка разделителя белым цветом.

Но в любом случае я бы предпочел JScrollPane + две таблицы внутри него вместо этого решения.

1 голос
/ 04 января 2012

Пожалуйста, посмотрите на ответ на этот вопрос, там было дано несколько хороших новых предложений: Разделители столбцов в JTable или JXTable

...