Подобные, но не идентичные вопросы, которые помогают: Java - возможно ли поместить JLayeredPane в JScrollPane? и Как отображать анимацию в ячейке JTable и Swing GUIпроектирование с использованием JScrollPane и JLayeredPane .
Чтобы сделать это правильно, необходимо рассмотреть три отдельных вопроса: изменение размера, изменение заголовков и пользовательского интерфейса.
определение размера
прокрутка иДля правильной окраски JScrollPane
необходимо знать размер и предпочтительный размер компонента внутри него, в данном случае JLayeredPane
.Но вы хотите, чтобы размер задавался таблицей, так как другие Component
s будут плавать поверх таблицы.В этом случае проще всего сделать свойства, связанные с размером делегата JLayeredPane, JTable
следующим образом.
final JTable table = new JTable();
JLayeredPane layers = new JLayeredPane() {
@Override
public Dimension getPreferredSize() {
return table.getPreferredSize();
}
@Override
public void setSize(int width, int height) {
super.setSize(width, height);
table.setSize(width, height);
}
@Override
public void setSize(Dimension d) {
super.setSize(d);
table.setSize(d);
}
};
// NB you must use new Integer() - the int version is a different method
layers.add(label, new Integer(JLayeredPane.PALETTE_LAYER), 0);
JScrollPane scrolling = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrolling.setViewportView(layers);
Если вы не хотите, чтобы JTable
был тем, что определяет размериз JLayeredPane
тогда он должен быть определен другим способом, как и размер таблицы.Оба будут нуждаться в явном вызове setPreferredSize()
и setSize()
.
Заголовки
Поскольку JTable больше не является областью просмотра, вам нужно будет самостоятельно связать заголовки.Будет работать следующий код:
scrolling.setColumnHeaderView(table.getTableHeader());
scrolling.setRowHeaderView(rowHeader);
UI
Также обратите внимание, что JTable делает некоторые неприятные коды в configureEnclosingScrollPane()
и configureEnclosingScrollPaneUI()
.Если вы хотите, чтобы изменения стиля пользовательского интерфейса работали должным образом, вам придется переопределить эти методы, но я еще не понял, как это сделать.