Java Swing;Проблемы с горизонтальной прокруткой для JTable, встроенного в JScrolledPane - PullRequest
2 голосов
/ 04 октября 2010

Я следовал нескольким советам в этом руководстве: JTable с горизонтальной полосой прокрутки , но все еще возникают проблемы.

У меня есть два заголовка столбца: Имя и Описание (для наших целей в этом примере.)

Я хочу иметь возможность прокручивать по горизонтали всякий раз, когда добавляется запись (то есть: Имя / Описание - это всего лишь 1 строка).Тем не менее, Swing, похоже, не выполняет этого поведения по умолчанию!

У меня есть JTable, встроенный в ScrollPane.JScrollPane имеет следующие параметры: JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED и JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED

Если я отключаю с помощью: myTable.AutoResizeMode(AUTO_RESIZE_OFF) заголовки столбцов не заполняют всю таблицу (возможно, только половину таблицы).Я должен вручную изменить размер столбца «Описание», чтобы увидеть все это.

Как я могу иметь автоматическое изменение размера, но горизонтальная прокрутка все еще работает?

Ответы [ 4 ]

2 голосов
/ 08 октября 2010

Вы можете расширить JTable следующим образом:

public class JHorizontalFriendlyTable extends JTable {

  @Override
  public Dimension getPreferredSize() {
    if (getParent () instanceof JViewport) {
      if (
        ((JViewport) getParent()).getWidth() > super.getPreferredSize().width)
      ) {
        return getMinimumSize();
      }
    }
    return super.getPreferredSize(); 
  }

  @Override
  public boolean getScrollableTracksViewportWidth () {
    if (autoResizeMode != AUTO_RESIZE_OFF) {
      if (getParent() instanceof JViewport) {
        return (((JViewport) getParent()).getWidth() > getPreferredSize().width);
      }
      return true;
    }
    return false;
  }
}

пример использования:

jScrollPane1 = new JScrollPane();
TableModel jTable1Model = new DefaultTableModel(...); 
JTable jTable1 = new JHorizontalFriendlyTable();
jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
jScrollPane1.setViewPortView(jTable1);
jTable1.setModel(jTable1Model);
jTable1.setPreferredSize(new java.awt.Dimension(1051,518));
jTable1.setPreferredScrollableViewPortSize(new java.awt.Dimension(1000,528));
jTable1.getSize(new java.awt.Dimension(1051, 528));

if (jTable1.getPreferredScrollableViewPortSize().getWidth() > 
  ((JViewPort) jTable1.getParent()).getPreferredSize().getWidth())
  {
  jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
  jTable1.doLayout();
}

jTable1.setDragEnabled(false);
jTable1.setColumnSelectionAllowed(false);
jTable1.getTableHeader().setReorderingAllowed(false);
2 голосов
/ 05 октября 2010

Одним из подходов может быть использование setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS) при создании таблицы, а затем использование setPreferredScrollableViewportSize() для указания желаемого размера. После pack() окна используйте setAutoResizeMode(JTable.AUTO_RESIZE_OFF), чтобы разрешить горизонтальную прокрутку.

1 голос
/ 05 октября 2010

Если я отключу с помощью: myTable.AutoResizeMode (AUTO_RESIZE_OFF), заголовки столбцов не заполняют всю таблицу (возможно, только 1/2 таблицы).

По умолчаниюкаждый столбец имеет ширину всего 75 пикселей.Вы можете изменить ширину столбца описания так, как вам нужно.Прочитайте API JTable, и вы найдете ссылку на учебник Swing «Как использовать таблицы», в котором объясняется, как это сделать.

Однако даже при таком подходе размер столбца не изменится, еслиПользователь изменяет размер кадра.Если вы хотите справиться с этой ситуацией, вам нужно добавить ComponentListener к таблице (или, возможно, к панели прокрутки).Затем всякий раз, когда вызывается метод componentResized(), вы можете суммировать ширину двух столбцов, а затем корректировать ширину столбца описания, как требуется, чтобы убедиться, что общая ширина столбца не меньше ширины таблицы.

Мне нужно вручную изменить размер столбца «Описание», чтобы увидеть все это.

Если вы знаете, что столбец описания всегда будет достаточно большим, чтобы заполнить область просмотра области прокрутки, тогдаВы можете использовать Настройщик столбца таблицы , чтобы автоматически рассчитать максимальную ширину столбца описания

1 голос
/ 05 октября 2010

Автоматическое изменение размера означает автоматическое изменение размера, чтобы избежать прокрутки.

Таким образом, ответ "нет" со стандартным JTable.

Проверьте JXTable и посмотрите, работает ли он, как вы хотите (я сам не использовал его).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...