Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > работа с JScrollPane


Автор: Foo 27.11.2006, 19:43
JScrollPane содерфит JTable причем видно только 1 строку.

Подскажите как можно:

 - прокрутить вниз до упора

 - узнать номер видимой строки

 - прокрутить к указанной строке

 - отловить событие нажатия на верхний(нижний) треугольник

хоть чтонибудь......

Автор: LSD 27.11.2006, 21:46
Цитата(Foo @  27.11.2006,  19:43 Найти цитируемый пост)
хоть чтонибудь......

Код
scrollPane.doSomething(someArgument);

Автор: ShurikA 27.11.2006, 22:05
Цитата(LSD @  27.11.2006,  20:46 Найти цитируемый пост)

scrollPane.doSomething(someArgument);


Чегото я не нахожу такую функцию...  smile 

Автор: Foo 27.11.2006, 23:05
2 LSD : спасибо за "исчерпывающий" ответ

я имел ввиду чтонибудь из того что я перечислил, скорее всего для решения моей задачи все не потребуются


пытался ипользовать:

Rectangle cellRect = supplementTable.getCellRect(row, col, false);
        scrollRectToVisible(cellRect);

чтобы вниз прокрутить, но почемуто только на предпоследнюю строку прокручивает

Автор: x82 28.11.2006, 11:26
Может стоит посмотреть в сторону JViewport? Это видимая зона компонента под JScrollPane.
Код

...
JViewport viewport = scrollPane.getViewport();
viewport.setViewPosition(point);
...

А там уже по координатам...  smile

Автор: LSD 28.11.2006, 11:41
Цитата(Foo @  27.11.2006,  23:05 Найти цитируемый пост)
2 LSD : спасибо за "исчерпывающий" ответ

я имел ввиду чтонибудь из того что я перечислил, скорее всего для решения моей задачи все не потребуются

Каков вопрос, таков и ответ. Из этого: 
Цитата(Foo @  27.11.2006,  19:43 Найти цитируемый пост)
- прокрутить вниз до упора 
- узнать номер видимой строки 
- прокрутить к указанной строке 
- отловить событие нажатия на верхний(нижний) треугольник

Понять что именно тебе нужно невозможно.


Цитата(Foo @  27.11.2006,  23:05 Найти цитируемый пост)
пытался ипользовать:

Rectangle cellRect = supplementTable.getCellRect(row, col, false);
        scrollRectToVisible(cellRect);

чтобы вниз прокрутить, но почемуто только на предпоследнюю строку прокручивает

У меня все работает.
Код
JTable table = new JTable(50, 50);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

JFrame frame = new JFrame();
frame.getContentPane().add(new JScrollPane(table));
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

Rectangle rectangle = table.getCellRect(table.getRowCount(), table.getColumnCount(), true);
table.scrollRectToVisible(rectangle);

Автор: Foo 28.11.2006, 22:08
Одну, проблему я решил с помощью scrollRectToVisible.

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

Автор: LSD 28.11.2006, 22:44
Ответы на первые 3 вопроса это: scrollRectToVisible() + getCellRect() + getVisibleRect().
На четвертый вопрос я ответить не могу т.к. не знаю что такое верхний(нижний) треугольник.

Автор: Foo 28.11.2006, 23:06
а в каком листенере мне проверять какая строка видна?

Автор: LSD 28.11.2006, 23:25
Код
Rectangle visibleRect = table.getVisibleRect();
Point leftUpper = new Point(visibleRect.x, visibleRect.y);
Point rightLower = new Point(visibleRect.x + visibleRect.width, visibleRect.y + visibleRect.height);
int minColumn = table.columnAtPoint(leftUpper);
int maxColumn = table.columnAtPoint(rightLower);
int minRow = table.rowAtPoint(leftUpper);
int maxRow = table.rowAtPoint(rightLower);

изменения видимой части отсеживаются так:
Код
scrollPane.getViewport().addChangeListener(new ChangeListener()
{
  public void stateChanged(ChangeEvent e)
  {
    ...
  }
});

Автор: Foo 28.11.2006, 23:41
спасибо LSD, все получилось

Код

table.getScrollPane().getViewport().addChangeListener(new ChangeListener(){
            public void stateChanged(ChangeEvent e) {
                if (table.getPersonTable().getVisibleRect().y == table.getPersonTable().getCellRect(table.getPersonTable().getRowCount()-1, 0, true).y){
                    deleteButton.setEnabled(true);
                }else{
                    deleteButton.setEnabled(false);
                }
                
            }
        });


table.getPersonTable().getVisibleRect() == table.getPersonTable().getCellRect(table.getPersonTable().getRowCount()-1, 0, true) почемуто давало false, поэтому чтобы не переопределять еквалс я взял координаты у, т.к. у меня меняется только она(высота и длина ячейки не меняется, хтоже не меняется т.к. 1 столбец)

Автор: LSD 28.11.2006, 23:46
Цитата(Foo @  28.11.2006,  23:41 Найти цитируемый пост)
table.getPersonTable().getVisibleRect() == table.getPersonTable().getCellRect(table.getPersonTable().getRowCount()-1, 0, true) почемуто давало false, поэтому

Потому что надо делать так:
Код
table.getPersonTable().getVisibleRect().equals(table.getPersonTable().getCellRect(table.getPersonTable().getRowCount()-1, 0, true))

== сравнивает только ссылки, а equals() сравнивает содержимое.

Автор: Foo 28.11.2006, 23:55
ну да, это ведь разные обьекты, но т.к. у меня меняется только у то мне всеравно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)