Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой компонент в JScroolPane, как извещать о изменении размера? 
V
    Опции темы
Lisus
Дата 5.10.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: 1
Всего: 2



Вопрос собствеено уже задан.

Есть свой компонент наследуемый от JPanel. В процессе добавления новых данный он должен увеличиваться. Логично засунуть его в JScrollPane, а вот как обвёртку извещать о новых размерах?
PM MAIL   Вверх
dorogoyIV
Дата 5.10.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



хм, так не надо ничего делать, все само должно работать
PM MAIL   Вверх
Dims
Дата 5.10.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



А как оно само-то может отработать? Мало ли что я там нарисую?
PM MAIL   Вверх
Старовъръ
Дата 5.10.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: нет
Всего: 10



Т.к. наследуется компонент от JPanel, то последний сам все сообщает скроллу.
PM MAIL WWW   Вверх
Dims
Дата 5.10.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(Старовъръ @  5.10.2008,  19:26 Найти цитируемый пост)
Т.к. наследуется компонент от JPanel, то последний сам все сообщает скроллу. 

Как он может сообщить скроллу то, чего сам не знает? 

Допустим, я переопределил paintComponent и там нарисовал линию длиной в километр. Откуда базовый JPanel об этом узнает?
PM MAIL   Вверх
Старовъръ
Дата 5.10.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: нет
Всего: 10



Если ты нарисуешь линию в км, то компонент не изменит своих размеров, просто линию не будет видно и все. Размеры меняются в зависимости от preferred, minimum, maximum Sizes. На них смотрит менеджер компановки и составляет пропорции, относительно всех остальных компонентов. А вот как определяет размеры внутренних компонентов JScrollPane мне и самому интересно...
PM MAIL WWW   Вверх
dorogoyIV
Дата 5.10.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



тогда устанавливай на свою панель новые размеры 
Код

myPanel.setPreferredSize(new Dimension(myPanel.getWidth()*2, myPanel.getHeight()*2));


Добавлено через 5 минут и 25 секунд
Цитата(Старовъръ @  5.10.2008,  21:54 Найти цитируемый пост)
А вот как определяет размеры внутренних компонентов JScrollPane мне и самому интересно...

JScrollPane как раз вот и берет PreferredSize компонента, а размер этого компонента знает LayoutManager
PM MAIL   Вверх
Dims
Дата 5.10.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(dorogoyIV @  5.10.2008,  22:05 Найти цитируемый пост)
тогда устанавливай на свою панель новые размеры 

Мне кажется, что логичней переопределить getSize. То есть, я переопределяю рисование компонента и я же переопределяю понятие о его размерах.

Добавлено через 5 минут и 28 секунд
Цитата(Старовъръ @  5.10.2008,  21:54 Найти цитируемый пост)
На них смотрит менеджер компановки и составляет пропорции, относительно всех остальных компонентов.

Я так понимаю, что менеджер компоновки делает вот что: (1) смотрит на всякие подсказки, которые ему даёт компонент (сюда входят всякие getPreferred, getMaximum и так далее), (2) думает, как ему расположить компоненты, при этом он может проигнорировать подсказки, (3) вызывает у компонентов методы setSize, чтобы задать размер, (4) смотрит, что получилось при помощи getSize и (5) раскладывает.

Если мы вызовем setPreferredSize, то менеджер может его и проигнорировать. Хотя менеджер скролла (там какой-то свой) наверняка не проигнориует, но мне кажется, что это будет не очень коррекно. Ведь этот метод определяет лишь ЖЕЛАЕМЫЙ размер. А нам надо задать ФАКТИЧЕСКИЙ.

PM MAIL   Вверх
Старовъръ
Дата 6.10.2008, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: нет
Всего: 10



Цитата

Мне кажется, что логичней переопределить getSize.
Какая-то дикость - getSize() должен выполнять свои функции и он их выполняет. Не нужно переопределять все на свете, не зря же создавались методы, предложенные Дорогим. Где-то говорили об антипаттернах, что-то мне их напомнило только что smile 
Цитата

Я так понимаю, что менеджер компоновки делает вот что: (1) смотрит на всякие подсказки, которые ему даёт компонент (сюда входят всякие getPreferred, getMaximum и так далее), (2) думает, как ему расположить компоненты, при этом он может проигнорировать подсказки, (3) вызывает у компонентов методы setSize, чтобы задать размер, (4) смотрит, что получилось при помощи getSize и (5) раскладывает.

Думаю лучше не гадать что делают менеджеры, а просто где-нибудь об этом почитать, если есть желание. И конечно же опубликовать выводы в данной теме.

Это сообщение отредактировал(а) Старовъръ - 6.10.2008, 06:36
PM MAIL WWW   Вверх
Dims
Дата 6.10.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(Старовъръ @  6.10.2008,  06:30 Найти цитируемый пост)
Какая-то дикость - getSize() должен выполнять свои функции и он их выполняет.

Его функция -- сообщать интересующимся о размере компонента. Почему Вы считаете дикостью переопределять его, если ответственность за размер уже переопределена?

PM MAIL   Вверх
Lisus
Дата 6.10.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: 1
Всего: 2



Прошу прощения, что обсуждение без меня проходит. Действительно все делается само.
Вот пример что примерно надо было сделать.
Сама панель-компонент
Код

import java.awt.LayoutManager;

import javax.swing.JPanel;
import java.awt.*;
import java.util.*;

public class MyPanel extends JPanel {
    ArrayList list = new ArrayList();
    int w = 500;

    public void addNewLine(String _s) {
        list.add(_s);
        this.setSize(w, 30 * list.size() + 10);
    }

    public Dimension getPreferredSize() {
        return new Dimension(w, 10 + 30 * list.size());
    }

    public void paintComponent(Graphics g) {
        int i_max = list.size();
        g.setColor(this.getBackground());
        g.clearRect(g.getClipBounds().x, g.getClipBounds().y,
                    g.getClipBounds().width, g.getClipBounds().height);

        for (int i = 0; i < i_max; i++) {
            g.setColor(Color.BLACK);
            g.drawRect(5, 5 + i * 30, w - 10, 25);
            g.drawString((String) list.get(i), 15, 30 * i + 22);
        }
    }
}


И пусковой фрейм.
Код

mport javax.swing.JFrame;
import javax.swing.*;

public class ResizedFrame extends JFrame {
    MyPanel mp = new MyPanel();
    JScrollPane jsp = new JScrollPane(mp);
    public ResizedFrame() {
    this.getContentPane().add(jsp);
    }

    public static void main(String[] args) {
        ResizedFrame t = new ResizedFrame();
        t.setBounds(20,20,600,600);
        t.mp.addNewLine("One String");
        t.setVisible(true);

        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
        }

        for(int y=0; y<20; y++){
        t.mp.addNewLine("String s  number : "+y);
        }

    }
}


Запускаем фрейм и ждем немного. Скролл реагирует правильно. Спасибо.
PM MAIL   Вверх
Dims
Дата 6.10.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



А попробуйте переопределить не getPreferredSize, а getSize. Будет работать?
PM MAIL   Вверх
Старовъръ
Дата 6.10.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: нет
Всего: 10



Цитата

Его функция -- сообщать интересующимся о размере компонента. Почему Вы считаете дикостью переопределять его, если ответственность за размер уже переопределена?
Зачем нарушать инкапсуляцию родителя, если можно просто установить preferredSize()? Такие вещи, как переопределение методов делаются, если метод родителя совсем не подходит сыну! Тем более это не просто метод, а метод обращения к переменной класса! То есть вместо того, чтоб мы установили переменную в нужное значение, мы изменим метод-обращения к ней, который вобще теперь к ней не будет обращаться, а вместо этого - самовольничать? И потом - все, что мы установим с помощью setPreferredSize() куда будет уходить? А если в том же классе тоже допустили ошибку проектирования и инкапсуляции: обращались не к методу getSize(), а напрямую к переменной, она, ведь, в классе видна всем методам? То есть getSize() и наша переменная будут показывать разные значения? Какие плюсы нам вобще даст это переопределение? На мой взгляд - никаких...
PM MAIL WWW   Вверх
Lisus
Дата 6.10.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: 1
Всего: 2



Dims
Видете ли работать оно может и будет, но...

При проектировании систем (например GUI) обычно одни методы делаются специально для переопределения (иногда просто абстрагируют их), а другие - для внутренней работы системы (их трогать не полагается).

По мне getSize относится ко вторым, а getPreferredSize к первым. И на это есть свои причины:
*) в литературе в качестве примеров указывали для переопределения именно preferredSize
*) внутри компонента есть понятие size и getSize должен именно его возвращать (как бин-геттер) и ничего другого
*) size - возвращает размер (это ОБЪЕКТИВНЫЙ параметр компонента), а вот preferedSize - это Субъективный размер по мнению автора компонента. Согласитесь, что машина не может понять какой бы размер был самым лучшим. И без человека здесь никак.

Ещё пара мыслей...
Я так понимаю, что систему мы извещаем о том какой по нашему мнению компонент должен занимать размер участка. далее нашу просьбу обрабатывает система и своё решение прячет в size.
Заметьте обе величины могут и не совпадать.

Например в том же примере. Если скролл больше чем желаемый размер, то компонент получает весь размер скролла. (помойму) А если размер не влизает в отведённую область, то устанавливается именно желаемый размер.

Да и зачем переопределять getSize если размер можно самому задать через setSize?
PM MAIL   Вверх
Lisus
Дата 6.10.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: 1
Всего: 2



Народ, проблема осталась.
Если не добавлять СкроллПане, а выводить напрямую в фрейм мою панель, то при добавлении новых строк компонент ужимается.
Т.е. если сам фрейм растянуть на 700, а компонент в длину 500, то после принудительного задания размера получается, что компонент занимает всего 5\7 длинны фрейма. В то время как менеджер расскладок должен его вытягивать на всю длинну.
Значит должно быть событие, которое сообщает об изменении размера, но чтобы вызывался менеджер расскладки и уже сам дул какой размер назначить компоненту.

setSize - не подходит, он задаёт размер жестко.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1087 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.