Что лучший способ состоит в том, чтобы настроить таблицу в JScrollPane, таким образом, что первый столбец всегда находится на экране в том же положении независимо от горизонтальной прокрутки и перекрывает столбцы та передача внизу?
Когда полоса прокрутки в оставленном самом дальнем, столбцы выглядят нормальными, но поскольку пользователь прокручивает направо, вторичные столбцы (2 и на) перемещение под первым, пока последний столбец не появляется на крайней правой из области просмотра?
Я нашел образец взятым от "Java Eckstein, Swing" заказывает такой, делает это, но он не позволяет изменять размер первого столбца. Я думал о некоторой схеме, где один JPanel содержал горизонтальную структуру и таблицу, содержащую вторичные столбцы и другой JPanel, который плавал по ним (зафиксированный независимо от прокрутки). Структура должна была бы сохранить диапазон области просмотра постоянным как первый столбец пущенный в ход вокруг. Идеально я мог сделать это с двумя таблицами с помощью той же модели, но я не уверен, является ли вся эта мысль наивным решением.
Я идеально хотел бы установку, где несколько таблиц находятся на той же области прокрутки вертикально, где все их первые столбцы выровненные и двигаются вместе и между отдельными таблицами существует только мало горизонтальных разрывов.
Таблица с фиксированными столбцами делает большую часть того, что вам нужно.
Он не поддерживает изменение размера фиксированного столбца, поэтому вам потребуется добавить такой код:
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 );
Я думаю, что вы на правильном пути. Концептуально у вас есть таблица с «столбцом заголовка» для каждой строки. Я бы использовал две таблицы - в одной есть самый левый столбец, а в другой - все остальные. Затем я представлял их в JSplitPane с таблицей «левый столбец» слева и остальными справа. Будет одна вертикальная полоса прокрутки, которая управляет смещением y обеих таблиц, и одна горизонтальная полоса прокрутки, контролирующая правую панель (только).
Вы также можете использовать расширенные функции JScrollPane для установки компонента «заголовок» слева от основной области прокрутки. Я никогда этого не делал, но вы можете использовать это в качестве «заголовков» ваших строк.
JScrollPane имеет область специально для этого, заголовок строки (см. диаграмму в API:)
Все, что вам нужно сделать, это: - создать дополнительную JTable для этой фиксированной области - подключить ее к первому столбцу вашей модели данных - установить ее в качестве заголовка строки - и в основной таблице опустить или удалить первый столбец данных.
При прокрутке панели прокрутки вверх и вниз обе таблицы будут прокручиваться синхронно без добавления кода. При горизонтальной прокрутке панели прокрутки заголовок строки всегда остается видимым, а прокручивается только главная таблица.
Для большинства случаев единственный дополнительный код, который вам понадобится, это код для изменения размера столбцов, как в примере camickr.