Как я могу создать JTable, где первый столбец всегда находится в области просмотра JScrollPane?

Что лучший способ состоит в том, чтобы настроить таблицу в JScrollPane, таким образом, что первый столбец всегда находится на экране в том же положении независимо от горизонтальной прокрутки и перекрывает столбцы та передача внизу?

Когда полоса прокрутки в оставленном самом дальнем, столбцы выглядят нормальными, но поскольку пользователь прокручивает направо, вторичные столбцы (2 и на) перемещение под первым, пока последний столбец не появляется на крайней правой из области просмотра?

Я нашел образец взятым от "Java Eckstein, Swing" заказывает такой, делает это, но он не позволяет изменять размер первого столбца. Я думал о некоторой схеме, где один JPanel содержал горизонтальную структуру и таблицу, содержащую вторичные столбцы и другой JPanel, который плавал по ним (зафиксированный независимо от прокрутки). Структура должна была бы сохранить диапазон области просмотра постоянным как первый столбец пущенный в ход вокруг. Идеально я мог сделать это с двумя таблицами с помощью той же модели, но я не уверен, является ли вся эта мысль наивным решением.

Я идеально хотел бы установку, где несколько таблиц находятся на той же области прокрутки вертикально, где все их первые столбцы выровненные и двигаются вместе и между отдельными таблицами существует только мало горизонтальных разрывов.

9
задан voodoogiant 30 March 2010 в 23:30
поделиться

3 ответа

Таблица с фиксированными столбцами делает большую часть того, что вам нужно.

Он не поддерживает изменение размера фиксированного столбца, поэтому вам потребуется добавить такой код:

MouseAdapter ma = new MouseAdapter()
{
    TableColumn column;
    int columnWidth;
    int pressedX;

    public void mousePressed(MouseEvent e)
    {
        JTableHeader header = (JTableHeader)e.getComponent();
        TableColumnModel tcm = header.getColumnModel();
        int columnIndex = tcm.getColumnIndexAtX( e.getX() );
        Cursor cursor = header.getCursor();

        if (columnIndex == tcm.getColumnCount() - 1
        &&  cursor == Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR))
        {
            column = tcm.getColumn( columnIndex );
            columnWidth = column.getWidth();
            pressedX = e.getX();
            header.addMouseMotionListener( this );
        }
    }

    public void mouseReleased(MouseEvent e)
    {
        JTableHeader header = (JTableHeader)e.getComponent();
        header.removeMouseMotionListener( this );
    }

    public void mouseDragged(MouseEvent e)
    {
        int width = columnWidth - pressedX + e.getX();
        column.setPreferredWidth( width );
        JTableHeader header = (JTableHeader)e.getComponent();
        JTable table = header.getTable();
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = (JScrollPane)table.getParent().getParent();
        scrollPane.revalidate();
    }
};

JTable fixed = fixedColumnTable.getFixedTable();
fixed.getTableHeader().addMouseListener( ma );
12
ответ дан 4 December 2019 в 10:31
поделиться

Я думаю, что вы на правильном пути. Концептуально у вас есть таблица с «столбцом заголовка» для каждой строки. Я бы использовал две таблицы - в одной есть самый левый столбец, а в другой - все остальные. Затем я представлял их в JSplitPane с таблицей «левый столбец» слева и остальными справа. Будет одна вертикальная полоса прокрутки, которая управляет смещением y обеих таблиц, и одна горизонтальная полоса прокрутки, контролирующая правую панель (только).

Вы также можете использовать расширенные функции JScrollPane для установки компонента «заголовок» слева от основной области прокрутки. Я никогда этого не делал, но вы можете использовать это в качестве «заголовков» ваших строк.

1
ответ дан 4 December 2019 в 10:31
поделиться

JScrollPane имеет область специально для этого, заголовок строки (см. диаграмму в API:)

Все, что вам нужно сделать, это: - создать дополнительную JTable для этой фиксированной области - подключить ее к первому столбцу вашей модели данных - установить ее в качестве заголовка строки - и в основной таблице опустить или удалить первый столбец данных.

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

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

5
ответ дан 4 December 2019 в 10:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: