Получить показанный компонент в JScrollPane - PullRequest
5 голосов
/ 13 декабря 2011

У меня есть JScrollPane, содержащая JPanel. Я заполняю эту JPanel многими кнопками.

Есть ли возможность получить отображаемые в данный момент кнопки?

Я знаю, что могу получить доступ к дочерним элементам JPanel через jpanel.getComponents(), но это все компоненты на этой панели; Я хочу только те, которые в настоящее время на экране.

Ответы [ 4 ]

8 голосов
/ 13 декабря 2011

Как уже прокомментировал ответ @ mKorbel:

  • это правильно, что вам нужны детские границы
  • это правильно, что вам нужно пересечь эти границы с "чем-то"
  • это неправильно что вам нужен содержащий видовой экран (или полоса прокрутки)

У JComponents есть API для получения их видимой в данный момент части независимо от того, как / где именно они отображаются в данный момент, поэтому «что-то» является visibleRect JComponent:

Rectangle visibleRect = myPanel.getVisibleRect();
for (Component child : myPanel.getComponents()) {
   Rectangle childBounds = child.getBounds();
   if (childBounds.intersects(visibleRect)) {
       // do stuff
   }
}
7 голосов
/ 13 декабря 2011

Я предполагаю, что этот контейнер уже виден на экране, затем я предлагаю

1) извлечь JViewPort из JScrollPane ,

2) addChangeListener до JViewPort

3) каждый видимый JComponent(s) возвращает Прямоугольник

4) и Прямоугольник # пересекается возвращает Boolean значение, если JComponent(s) видно или нет в JViewPort

1 голос
/ 13 декабря 2011

Как насчет запроса компонентов, если они видны:

for ( Component component : jpanel.getComponents() ) {
    if ( component instanceof JButton && component.isShowing() ) {
        // We've found a button that is showing...
    }
}
0 голосов
/ 13 декабря 2011
scrollPane.getViewport().getView()
scrollPane.getViewport().getViewRect()
...