JTable внутри JLayeredPane внутри JScrollPane - как заставить его работать? - PullRequest
4 голосов
/ 12 июля 2011

Я хочу поместить объекты, выходящие из JTable, на несколько слоев поверх него, поэтому использование JLayeredPane кажется естественным.Однако заставить его правильно рисовать, правильно делать заголовки и т. Д. Очень сложно.Как мне сделать это так:

  • Заголовки строк появляются и совпадают при прокрутке
  • Заголовки столбцов появляются и совпадают при прокрутке
  • таблица рисует правильно
  • изменение размера не все портит

Обратите внимание, что поскольку JDesktopPane расширяет JLayeredPane, ответы на этот вопрос также позволяют иметь JTable(или любой другой компонент) за JDesktopPane.

1 Ответ

4 голосов
/ 12 июля 2011

Подобные, но не идентичные вопросы, которые помогают: 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().Если вы хотите, чтобы изменения стиля пользовательского интерфейса работали должным образом, вам придется переопределить эти методы, но я еще не понял, как это сделать.

...