Страница 1 из 1

JFrame, componentResized

Добавлено: 09 фев 2005, 01:36
Oscar
У меня на фрейме есть 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 не посылать, скроллинг должен быть вверху!..

Добавлено: 09 фев 2005, 04:11
AiK
Oscar, я с подобной проблемой не сталкивался, но просто посмотрел исходники метода reshape.
Если размеры не изменяются , то не вызывается методы invalidate. Поскольку ты этот метод нигде вызвать не пытался, то видимо вся засада в нём. Хотя там много чего ещё не проиходит, если размеры не менялись :)

Добавлено: 09 фев 2005, 05:29
Oscar
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)
:-)

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

Я на самом деле меняю размер СкроллБара! А эти изменения не отображаются! (Отображаются, на шаг позже).
Вот в чём проблема.

Добавлено: 09 фев 2005, 05:42
AiK
Oscar, JDK у меня более древний есс-но...
Кстати, вспомнилась изюмительная тема про layouts. Ты каким макаром скроллбар на фрейм кладёшь?

Добавлено: 09 фев 2005, 06:06
Oscar
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 - у меня не будет пустого поля (схематически - иксы).

Но я не большой знаток Лейаутов.
А что тебе вспомнилось?

Добавлено: 09 фев 2005, 15:40
Ghost
А ты repaint() переопределял?

Добавлено: 09 фев 2005, 15:58
AiK
А что тебе вспомнилось?
Мне много чего вспомнилось, но злобный хостер не дал написать :(

Суть такая - layout's в частности заведуют растягиванием компонентов. Просто выбери какой-нибудь ячеистый layout, GridLayout или GridBagLayout. Соответственно разбиваешь свой фрейм на четыре ячейки и кладёшь туда свои компоненты, оставив одну пустой. И всё.

Добавлено: 09 фев 2005, 21:47
Oscar
Ghost, да, об этом я написал ещё в первом мессадже.

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

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

----

Вопрос о перересовке скроллбара, после изменения размеров окна, я бы оставил открытым ..

Добавлено: 11 фев 2005, 17:52
Oscar
вопрос снимается ...
не знаю точно, что я изменил, но теперь, если поставить repaint() скроллбары нормально перерисовываются ...