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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Совершенно запутался! Проблема в следующем:
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2011, 17:26
Ответы с готовыми решениями:

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

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

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

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

4
unknown
16.06.2011, 17:29 2
Извиняюсь за опечатку, в конструкторе класса MyFrame во фрейм добавляю экземпляр класса TableCanvas, т.е. вместо
Java
1
2
  ...
  add(new MyComponent());
следует понимать
Java
1
2
  ...
  add(new TableCanvas());
unknown
16.06.2011, 17:44 3
правильно ли сделать так: переопределить метод 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 4
всякий раз, когда размер меняется, вызывается paint() для перерисовки. можно там и проверять наличие буфера и соответствие его размеров размерам компонентов. если не соответствует, то создать новый буфер
0
unknown
17.06.2011, 01:54 5
Дело в том что в методе paint() не хотелось бы вводить дополнительные проверки, для этого я наследовал интерфейс ComponentListener который изменяет размер буффера, т.е. метод componentResized(...) вызывается всякий раз автоматически. Проблема возника при начальной инициализации буффера. И вопрос был о том - в какой момент лучше создавать буффер, или другими словами в какой момент (кроме метода paint()) можно быть уверенным что компонент выведен на экран?
17.06.2011, 01:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2011, 01:54
Помогаю со студенческими работами здесь

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

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

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

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

Где и какой нужно скачать DirectX? (отсутствует d3dx9_30.dll)
В центре обновления, всё качал, в everest'e непонятно какая версия установлена... Если качать...

Какими средствами нужно защищаться от угроз?
как защититься от таких угроз? 1) Выявление паролей 2) Отказ в обслуживании DDoS 3) Подмена...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru