Java Swing - Понимание JViewport - PullRequest
       3

Java Swing - Понимание JViewport

4 голосов
/ 11 апреля 2011

У меня есть JTable с JScrollPane.Есть что-то, чего я не понимаю в окне просмотра scrollPane ... Я сейчас выбираю номер строки 1000 в таблице, поэтому многие строки над ней не видны на экране.Теперь, когда я проверяю, видима ли строка 0 в текущем окне просмотра, он говорит «Да».Вот мой код:

    JViewport viewport = scrollPane1.getViewport();
    Rectangle rect = table1.getCellRect( 0, 1, true ); 

    // Check if view completely contains the row 0 :
    if( viewport.contains( rect.getLocation() ) )
        System.out.println( "The current view contains row 0" );

Этот код всегда возвращает true, и текст печатается независимо от того, на какой строке я стою.Я что-то здесь упускаю?

Ответы [ 2 ]

3 голосов
/ 11 апреля 2011

Метод, который вы ищете:

 getVisibleRect()

он определен в JComponent, в вашем контексте вы используете его

 table1.getVisibleRect().contains(rect)

edit: только что понял, что вы, вероятно, все еще царапаетсяваша голова - даже если все ответы, которые уже даны, технически правильны: -)

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

Но смешивание вы сделали:

      // cellRect is in table coordinates
      Rectangle cellRect = table.getCellRect(...)
      // WRONG!!! use table coordinates in parent sytem
      table.getParent().contains(cellRect.getLocation());

Решение состоит в том, чтобы найти систему координат, в которой имеет место местоположение ячейки, как указано выше (или перевести местоположение ячейки в родительскую систему вручную, ноздесь это не нужно), есть методы, которые выполняют перевод:

      // returns the visible part of any component in its own coordinates
      // available for all components
      Rectangle visible = table.getVisibleRect();
      // special service method in JViewport, returning the visible portion
      // of its single child in the coordinates of the child
      Rectangle viewRect = ((Viewport) (table.getParent()).getViewRect();
      // both are the same 
      visible.equals(viewRect)

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

0 голосов
/ 11 апреля 2011

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

JViewPort.getViewRect().contains(rect.getLocation());

Я считаю.

...