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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двойная буферизация. Кнопки. Кнопки пропадают при перерисовке. 
V
    Опции темы
soulcub
Дата 10.2.2010, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Используя двойную буферизацию, добился НЕмигания при перерисовке.. Но вот проблема, на jFrame4 так же есть 2 кнопки, которые при выполнении paint исчезают и появляются только, если на них навести.
Код
    public void paint(Graphics g){

      jFrame4.createBufferStrategy(2);
      BufferStrategy bufferStrategy = jFrame4.getBufferStrategy();

      g = bufferStrategy.getDrawGraphics();

      g.setColor(new Color(30, 100, 190));
        
      g.drawRect(49, 69, 402, 402);

      bufferStrategy.show();

    }

Была идея, как-то ограничить поле перерисовки, а не перерисовывать весь фрейм, но реализовать не вышло.. Устроил бы и такой вариант.. Или же каким-то образом прорисовать кнопки заново в этой же функции, но опять же не вышло(
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
soulcub
Дата 11.2.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Пытался сделать такими способами(закомментировано):

Код

    public void paint(Graphics g){

      jFrame4.createBufferStrategy(2);
      BufferStrategy bufferStrategy = jFrame4.getBufferStrategy();

      g = bufferStrategy.getDrawGraphics();

      g.setColor(new Color(30, 100, 190));
        
      g.drawRect(49, 69, 402, 402);

      //     jButton4.paint(jButton4.getGraphics()); - так, кнопка появляется и сразу исчезает
      //     jButton4.repaint(); - а так, она есть, но почему-то видно её перерисовку...

      bufferStrategy.show();

    }


Ничего не могу поделать, помогите, плиз..


Это сообщение отредактировал(а) soulcub - 11.2.2010, 17:42
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
jk1
Дата 11.2.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



При переопределении методов, осуществляющих отрисовку, необходимо вызывать метод суперкласса:
Код

super.paint(g);

Вероятная причина вашей проблемы в том, что версия метода в суперклассе рисует дочерние компоненты контейнера, а ваша - нет. Читаем документацию:
Цитата

This method actually delegates the work of painting to three
protected methods: <code>paintComponent</code>,
<code>paintBorder</code>,
and <code>paintChildren</code>.  They're called in the order
listed to ensure that children appear on top of component itself.

Как видите, оригинальная реализация делает кое-какие действия для отрисовки дочерних элементов в этом методе.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
soulcub
Дата 11.2.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Ну... Я попробовал вызвать super.paint(g); в...... да где только не пробовал.. Ничего не меняется.. 
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
jk1
Дата 11.2.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Цитата

Ничего не меняется..  

Давайте код целиком, будем разбираться.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
soulcub
Дата 11.2.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Вообще то что было в 1 посте - в принципе всё) Ну вот
Код


    public void paint(Graphics g){

        jFrame4.createBufferStrategy(2);
        BufferStrategy bufferStrategy = jFrame4.getBufferStrategy();
        g = bufferStrategy.getDrawGraphics();

        //Тут я рисую обычными g.блаблабла() всякие прямоугольники и тд, которые 
        //не мигают при вызове функции repaint()

        bufferStrategy.show();

        jButton4.paint(jButton4.getGraphics()); //Вот пытаюсь перерисовать кнопки
        jButton5.paint(jButton5.getGraphics()); //Без этих строк, они исчезают при каждом repaint()
                                           //А с ними, блымают при движении мышки..
        // jButton4.repaint();

    }

    public void repaint() {

        Graphics g = null;
        paint(g);

    }

    private void jFrame4MouseMoved(java.awt.event.MouseEvent evt) {                                   
        repaint();
    }    

  

Это сообщение отредактировал(а) soulcub - 11.2.2010, 19:39
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
jk1
Дата 11.2.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Вот пример, который делает тоже самое, что и приведенный вами, но не глючит
Код

public class GUI extends JFrame {

    public GUI() {
        super();
        CustomPanel n = new CustomPanel();
        n.add(new JButton("One"));
        n.add(new JButton("Two"));
        this.setContentPane(n);
        this.setSize(new Dimension(300, 300));
        this.setVisible(true);

    }

    public static void main(String... args) {
        new GUI();
    }

    private class CustomPanel extends JPanel {
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.setColor(new Color(30, 100, 190));
            g.fillOval(100,100,50,60);
            g.drawRect(49, 69, 202, 202);
        }
    }
}



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
soulcub
Дата 11.2.2010, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Нет, не совсем так... У меня акцент идёт именно на двойную буферизацию.. Без неё с кнопками у меня всё в порядке.. А вот с ней, кнопки начинают пропадать. В Вашем примере кнопки рисуются единожды, и если добавить сюда 2-ю буферизацию, тоже пропадут при перерисовке..
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
soulcub
Дата 11.2.2010, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Вот сварганил из своего же проекта упрощённую версию.. Проблема осталась.

Внимание на конструктор можно не обращать(скопировал с генерированного кода нетбинса).

Код

import java.awt.*;
import java.awt.image.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Randomm extends javax.swing.JFrame {

    public Randomm() {

        jFrame4 = new javax.swing.JFrame();
        jButton4 = new javax.swing.JButton("123");
        jButton5 = new javax.swing.JButton("321");

        jFrame4.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jFrame4.setBounds(new java.awt.Rectangle(20, 20, 1000, 700));
        jFrame4.setEnabled(false);
        jFrame4.setResizable(false);
        jFrame4.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                jFrame4MouseMoved(evt);
            }
        });

        javax.swing.GroupLayout jFrame4Layout = new javax.swing.GroupLayout(jFrame4.getContentPane());
        jFrame4.getContentPane().setLayout(jFrame4Layout);
        jFrame4Layout.setHorizontalGroup(
            jFrame4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jFrame4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jFrame4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jButton4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 1022, Short.MAX_VALUE)
                    .addGroup(jFrame4Layout.createSequentialGroup()
                        .addComponent(jButton5, javax.swing.GroupLayout.PREFERRED_SIZE, 197, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        jFrame4Layout.setVerticalGroup(
            jFrame4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jFrame4Layout.createSequentialGroup()
                .addContainerGap()
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jFrame4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jFrame4Layout.createSequentialGroup()
                        .addComponent(jButton5, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(31, 31, 31))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jFrame4Layout.createSequentialGroup()
                        .addGroup(jFrame4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE))
                        .addGap(50, 50, 50)))
                .addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(400, 300));
        setResizable(false);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }

//*********************************Смотреть ниже*************************************

    static Randomm frame;

    public void paint(Graphics g){

        jFrame4.createBufferStrategy(2);                                                    //Собственно сама двойная буферизация
        BufferStrategy bufferStrategy = jFrame4.getBufferStrategy();        //Собственно сама двойная буферизация
        g = bufferStrategy.getDrawGraphics();                                           //Собственно сама двойная буферизация


        g.setColor(new Color(20, 70, 130));        //Рисую поле, которое должно перерисовываться при движении мышки
        g.fillRect(49, 69, 402, 402);

        g.setColor(new Color(30, 100, 190));

        g.drawRect(49, 69, 402, 402);
        g.drawRect(549, 69, 402, 402);
        for(int i = 0; i <= 10; i++) {
            g.drawLine(50+i*40, 70, 50+i*40, 470);
            g.drawLine(50 ,70+i*40, 450, 70+i*40);

            g.drawLine(550 + i*40, 70, 550+i*40, 470);
            g.drawLine(550, 70+i*40, 950, 70+i*40);
        }

        g.setColor(Color.red);

        g.drawRect(50, 525, 160, 40);
        g.drawRect(290, 525, 120, 40);
        g.drawRect(490, 525, 80, 40);
        g.drawRect(650, 525, 40, 40);

        g.setColor(Color.green);

        jButton5.repaint();        //Тщетно пытаюсь перерисовать кнопочку

        bufferStrategy.show();        //Показываю, что нарисовал


        jButton4.paint(jButton4.getGraphics());        //И тут тщетно
    }

    public void repaint() {

        Graphics g = null;
        paint(g);

    }

    private void jFrame4MouseMoved(java.awt.event.MouseEvent evt) {
            repaint();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {

                frame = new Randomm();
                frame.setVisible(false);
                frame.jFrame4.setVisible(true);
                frame.jFrame4.setEnabled(true);
            }
        });
    }

    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JFrame jFrame4;

}


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

Это сообщение отредактировал(а) soulcub - 11.2.2010, 22:51
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
jk1
Дата 11.2.2010, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Код говорит о том, что о двойной буферизации в Java вы имеете довольно смутное представление.
Что касается двойной буферизации в Swing-компонентах, вот информация из первых рук (java.sun.com):
Цитата

One of the most notable features of Swing is that it builds support for double-buffering right into the toolkit. It does the by providing a "doubleBuffered" property on javax.swing.JComponent:
                public boolean isDoubleBuffered()
                public void setDoubleBuffered(boolean o)
Swing's double buffer mechanism uses a single offscreen buffer per containment hierarchy (usually per top-level window) where double-buffering has been enabled. And although this property can be set on a per-component basis, the result of setting it on a particular container will have the effect of causing all lightweight components underneath that container to be rendered into the offscreen buffer, regardless of their individual "doubleBuffered" property values.

By default, this property is set to true for all Swing components. But the setting that really matters is on JRootPane, because that setting effectively turns on double-buffering for everything underneath the top-level Swing component. For the most part, Swing programs don't need to do anything special to deal with double-buffering, except to decide whether it should be on or off (and for smooth GUI rendering, you'll want it on!). Swing ensures that the appropriate type of Graphics object (offscreen image Graphics for double-buffering, regular Graphics otherwise) is passed to the component's paint callback, so all the component needs to do is draw with it.

Если по каким-то причинам  вам не подходит стандартная реализация, вот эта статья может послужить хорошим примером использования BufferStrategy.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
soulcub
Дата 11.2.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Если бы я ещё с английским дружил.... Ладно.. Как я понял этот код парой строчек не сделаешь таким как нужно? Нужно кардинально всё менять?
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
jk1
Дата 11.2.2010, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Нужно. Вот тут несложная реализация с комментариями на русском, там же объяснены основные принципы того, как в Java можно реализовать двойную буферизацию средствами AWT.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
soulcub
  Дата 12.2.2010, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

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



Всё, спасибо большое) Друг нашёл ответ) Если кто ещё будет озадачен, просто нужно джифрейму позволить методом paintComponents(g) перерисовывать компоненты..
Код

    public void paint(Graphics g){

      jFrame4.createBufferStrategy(2);
      BufferStrategy bufferStrategy = jFrame4.getBufferStrategy();
      g = bufferStrategy.getDrawGraphics();
      jFrame4.paintComponents(g);

      g.setColor(new Color(30, 100, 190));
        
      g.drawRect(49, 69, 402, 402);

      //     jButton4.paint(jButton4.getGraphics()); - так, кнопка появляется и сразу исчезает
      //     jButton4.repaint(); - а так, она есть, но почему-то видно её перерисовку...

      bufferStrategy.show();

    }


Это сообщение отредактировал(а) soulcub - 12.2.2010, 02:04
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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