JScrollBar видимый - PullRequest
       5

JScrollBar видимый

3 голосов
/ 10 августа 2009

Есть ли какой-нибудь способ узнать, виден ли JScrollBar или нет внутри JPanel?

Я имею в виду, что иногда моя панель имеет много прямоугольников (думаю, что это кнопки) и нуждается в полосе прокрутки, а иногда она не нужна. Я хотел бы знать, могу ли я знать, когда это показывают.

Ответы [ 4 ]

3 голосов
/ 10 августа 2009

Если вы расширите JPanel и добавите себе JScrollbar s (по горизонтали и / или по вертикали), тогда вы сможете контролировать, когда они должны быть видимыми или невидимыми
(вы можете проверить, видны ли они в данный момент с помощью функции isvisible())

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

  • JGraphPanel (обратный вызов actionPerformed(Event e) будет регулировать видимость на основе коэффициента масштабирования)
  • Plane (его функция adjustComponents() вызовет setVisible() на JScrollBar при необходимости)
2 голосов
/ 14 сентября 2012

Если вам также необходимо получать уведомления об изменениях видимости, используйте следующий код:

final JScrollPane scroll = new JScrollPane(createMyPanel());
scroll.getVerticalScrollBar().addHierarchyListener(new HierarchyListener() {
  @Override
  public void hierarchyChanged(HierarchyEvent e) {
    if (e.getID() == HierarchyEvent.HIERARCHY_CHANGED && 
      (e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) {
      System.out.println(scroll.getVerticalScrollBar().isVisible());
    }
  }
});
2 голосов
/ 10 августа 2009

Если у вас есть ссылка на JScrollPane, вы можете просто позвонить

yourJScrollPane.getHorizontalScrollBar().isVisible()

или

yourJScrollPane.getVerticalScrollBar().isVisible()
1 голос
/ 09 октября 2012

В дополнение к ответам VonC и Джошуа, стоит отметить, что isVisible() - это метод в суперклассе Component. Кроме того, javadoc заявляет:

Определяет, должен ли этот компонент быть видимым, когда его родительский элемент видим. Компоненты изначально видимы, за исключением компонентов верхнего уровня, таких как объекты Frame.

Это означает, что до тех пор, пока JScrollPane не будет добавлен в размерный кадр, вызов isVisible() для JScrollBar будет всегда возвращать true.

Рассмотрим следующий SSCCE:

public static void main(String[] args) {
  // creates a small table in a larger scroll pane
  int size = 5; 
  JTable table = new JTable(makeData(size), makeHeadings(size));
  JScrollPane pane = new JScrollPane(table);
  pane.setPreferredSize(new Dimension(200, 200));
  System.out.println(pane.getVerticalScrollBar().isVisible()); // prints true

  JFrame frame = new JFrame("JScrollPane Test");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setContentPane(pane);
  System.out.println(pane.getVerticalScrollBar().isVisible()); // prints true

  frame.pack();
  System.out.println(pane.getVerticalScrollBar().isVisible()); // prints false

  frame.setVisible(true);
  System.out.println(pane.getVerticalScrollBar().isVisible()); // prints false
}

private static Object[] makeHeadings(int size) {
  Object[] headings = new Object[size];
  for (int i=0; i<size; i++){
    headings[i] = i;
  }
  return headings;
}

private static Object[][] makeData(int size) {
  Object[][] data = new Object[size][size];
  for (int i=0; i<size; i++){
    for (int j=0; j<size; j++){
      data[i][j] = i*j;
    }
  }
  return data;
}

Аналогично, стоит добавить, что если вы добавляете JScrollPane к внутреннему фрейму, то scrollBar.isVisible() будет работать только после добавления внутреннего фрейма к другому компоненту.

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