Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
unknown

Нужно организовать двойную буфферизацию средствами AWT, которая в Java1 отсутствует

16.06.2011, 17:26. Показов 1033. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Совершенно запутался! Проблема в следующем:
Java: jdk1.1.8
Задача: организовать двойную буфферизацию средствами AWT, которая в Java1 отсутствует.
--------------------------------------
Проблема:
не могу понять на каком этапе нужно создавать внеэкранный графический буфер. У меня есть приложение (application) запускается во фрейме MyFrame в который я размещаю свой компонент MyComponent для вывода графики.

Класс фрейма:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyFrame extends Frame {
 public static void main(String[] args) {
        TableFrame tf = new TableFrame();
 
 }
 
 public MyFrame() {
      setSize(800,600);
      addNotify();            // правильно ли использование здесь этого метода?
      setVisible(true);
      add(new MyComponent()); //
      pack();
 }
}
Класс моего компонента:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class TableCanvas extends Component implements ComponentListener {
    protected final static int DEFAULT_WIDTH = 400;
    protected final static int DEFAULT_HEIGHT = 600;
 
    /** Размеры компонента */
    protected int width, height;
    /** Графический буффер - Offscreen Image */
    protected Image buffer;
    /** Графический контекст буффера */
    protected Graphics offscreenGraphics;
 
    /**
     * Конструктор
     */
    public TableCanvas() {
        addComponentListener(this);
        this.width = DEFAULT_WIDTH;
        this.height = DEFAULT_HEIGHT;
        setSize(width, height);
    }
 
    /**
     * Создание offscreen-буффера с текущим размером компонента
     */
    public void createBuffer() {
        buffer = createImage(width+1, height+1);
        offscreenGraphics = buffer.getGraphics();
    }
 
    /**
     * Прорисовка содержимого компонента
     * @param g
     */
    public void paint(Graphics g) {
        g.drawImage(buffer, 0,0, this);
        g.dispose();
    }
    public void update(Graphics g) {
        paint(g);
    }
 
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }
    public Dimension getMinimumSize() {
        return new Dimension(width, height);
    }
 
    /**
     * Изменение размеров компонента
     * Автоматическое создание нового буффера
     * @param e
     */
    public void componentResized(ComponentEvent e) {
        Dimension d = getSize();
        this.width = d.width;
        this.height = d.height;
        createBuffer();
    }
    public void componentMoved(ComponentEvent e) {}
    public void componentShown(ComponentEvent e) {}
    public void componentHidden(ComponentEvent e) {}
}
Мне нужно автоматически создавать этот буффер, в каком месте прграммы вызывать метод createBuffer() ????? Потому что иногда он создается автоматически за счет того что фрейм успевает создаться раньше и изменить размеры MyComponent, но чаще всего выдается исключение NullPointerException.

В общем запутался в этих методах типа addNotify(), validate и т.п. подскажите пожалуйста как нужно делать чтобы этот буффер создавался автоматически при запуске приложения. Не очень хочется вводить в код разные дополнительные проверки и перехват исключений.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.06.2011, 17:26
Ответы с готовыми решениями:

Исходник апплета использующего двойную буфферизацию
Народ, подскажите ссылку на исходник апплета использующего двойную буфферизацию. А то никак врубиться не могу. Заранее спасибо.

Нужно с (ava.awt.event.ActionEvent evt) получить объект JFrame
Вот как я действовал, но пришел в тупик - тоесть null private void ExitButActionPerformed(java.awt.event.ActionEvent evt) { ...

Нужно сделат в AWT, во ФРЕЙМЕ картинки на Button, или на худой конец на Panel.
Нужно сделат в AWT, во ФРЕЙМЕ картинки на Button, или на худой конец на Panel.

4
unknown
16.06.2011, 17:29
Извиняюсь за опечатку, в конструкторе класса MyFrame во фрейм добавляю экземпляр класса TableCanvas, т.е. вместо
Java
1
2
  ...
  add(new MyComponent());
следует понимать
Java
1
2
  ...
  add(new TableCanvas());
unknown
16.06.2011, 17:44
правильно ли сделать так: переопределить метод addNotify для моего класса TableCanvas?
Java
1
2
3
4
    public void addNotify() {
        super.addNotify();
        createBuffer();
    }
вроде буффер создается правильно автоматически при создании компонента и помещения его во фрейм. пока я тестировал - исключения не лезли - но надежно ли это??
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
16.06.2011, 21:33
всякий раз, когда размер меняется, вызывается paint() для перерисовки. можно там и проверять наличие буфера и соответствие его размеров размерам компонентов. если не соответствует, то создать новый буфер
0
unknown
17.06.2011, 01:54
Дело в том что в методе paint() не хотелось бы вводить дополнительные проверки, для этого я наследовал интерфейс ComponentListener который изменяет размер буффера, т.е. метод componentResized(...) вызывается всякий раз автоматически. Проблема возника при начальной инициализации буффера. И вопрос был о том - в какой момент лучше создавать буффер, или другими словами в какой момент (кроме метода paint()) можно быть уверенным что компонент выведен на экран?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2011, 01:54
Помогаю со студенческими работами здесь

Autoclosable - java1.7
есть такой код: public void test (com.google.inject.Provider<T> daoProvider) { try ( PrepapredStatement ps =...

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

Экран моргает после установки NetBeans5.5 + Java1.5
Поставил NetBeans5.5 + Java1.5 . Иногда экран начинает моргать, раз эдак 10 подряд. Мне NetBeans и без этого, как новые ботинки. Кто...

Как организовать поиск в 1С 8.2? Нужно организовать поиск, например, по ФИО?
Например ситуация: мне из списка надо найти "Марьина Любовь Викторовна" и что-бы по ней вышла вся информация, т.е. я открываю отчет и там...

Получение subImage в java1.1.x - как настроить класс MemoryImageSource??
здравствуйте. возникла следующая проблема - необходимо в java1 организовать аналог метода subImage(..) который есть в Java2 (Java2D). ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru