JFrame, componentResized

Модератор: Absurd

Ответить
Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

09 фев 2005, 01:36

У меня на фрейме есть JScrollBar hScrolll, я хочу, чтобы ширина была равна ширине окна. А вот-с не получается по человечески у меня это сделать ...

Код: Выделить всё

public class Matrix extends JFrame implements ComponentListener{
...
public void componentResized (ComponentEvent e) {
hScroll.setBounds(0, 0, getWidth(), 20);
}
Идёт запаздывание на один шаг.
То есть изменения размера hScroll происходят, НО графика не перерисовывается!!

Я попробовал добавить в метод componentResized:

hScroll.repaint();
repaint();

то же самое.

Пробовал прописывать hScroll.setBounds(..) в методы

paint
repaint
setSize
setBounds

класса Matrix (после чего вызывал метод предка) - ничего не помогло.

В конце концов у меня получилось,
в метод componentResized я добавил строку:

Код: Выделить всё

if (resize) setSize(getWidth()+1,getHeight()+1);
По каким законам я устанавливаю булевую переменную resize - уже дело десятое, это специфика моего задания.
Просто после setSize заново делается перерисовка окна.
Кстати,
setSize(getWidth(),getHeight());
не проходит. Не будет рефреша.

Собственно вопрос:
Это ненормально, чтобы так происходили изменения..
Если кто-то знает, как это делается по людски - подскажите, пожалуйста.

P.S. На JScrollPane не посылать, скроллинг должен быть вверху!..
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

09 фев 2005, 04:11

Oscar, я с подобной проблемой не сталкивался, но просто посмотрел исходники метода reshape.
Если размеры не изменяются , то не вызывается методы invalidate. Поскольку ты этот метод нигде вызвать не пытался, то видимо вся засада в нём. Хотя там много чего ещё не проиходит, если размеры не менялись :)
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

09 фев 2005, 05:29

AiK,

public void reshape(int x, int y, int w, int h);
Deprecated. As of JDK 5, replaced by Component.setBounds(int, int, int, int)
:-)

Но суть не в том. Менять размер окна - это уловка, вынужденая необходимостью.

Я на самом деле меняю размер СкроллБара! А эти изменения не отображаются! (Отображаются, на шаг позже).
Вот в чём проблема.
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

09 фев 2005, 05:42

Oscar, JDK у меня более древний есс-но...
Кстати, вспомнилась изюмительная тема про layouts. Ты каким макаром скроллбар на фрейм кладёшь?
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

09 фев 2005, 06:06

AiK,
setLayout(null);
потом Панель (с BorderLayout, по умолчанию), а на ней всего лишь один Scrollbar...

И ещё ... Панель я ложу не простую ...
Я в ней метод setBounds сделал пустым, чтоб оно его не двигало самовольно ..

иначе оно его растягивает ... да, это как бы то, что нужно, но ..
одновременно и прижимает hScroll к левому краю

На схеме - два скроллбара и матрица внутри ..

Код: Выделить всё

 ------------------
|xx  h S c r o l l |
|xx                |
|                  |
|v   11111111111   |
|S   11111111111   |
|c   11111111111   |
|r   11111111111   |
|o   11111111111   |
|l   11111111111   |
|l   11111111111   |
 ------------------
Если я буду использовать BorderLayout - у меня не будет пустого поля (схематически - иксы).

Но я не большой знаток Лейаутов.
А что тебе вспомнилось?
Ghost
Сообщения: 4
Зарегистрирован: 07 фев 2005, 18:57

09 фев 2005, 15:40

А ты repaint() переопределял?
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

09 фев 2005, 15:58

А что тебе вспомнилось?
Мне много чего вспомнилось, но злобный хостер не дал написать :(

Суть такая - layout's в частности заведуют растягиванием компонентов. Просто выбери какой-нибудь ячеистый layout, GridLayout или GridBagLayout. Соответственно разбиваешь свой фрейм на четыре ячейки и кладёшь туда свои компоненты, оставив одну пустой. И всё.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

09 фев 2005, 21:47

Ghost, да, об этом я написал ещё в первом мессадже.

AiK,
GridLayout не подойдёт, у него все ячейки одного размера.
GridBagLayout - как бы да ... но чую, наморочусь я с ним ...

В общем - Спасибо, попробую!

----

Вопрос о перересовке скроллбара, после изменения размеров окна, я бы оставил открытым ..
Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

11 фев 2005, 17:52

вопрос снимается ...
не знаю точно, что я изменил, но теперь, если поставить repaint() скроллбары нормально перерисовываются ...
Ответить