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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сначало нарисовать 10 картинок.. потом показать их пользователю.. как ? 
:(
    Опции темы
polosatij
  Дата 15.11.2004, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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



сначало нарисовать 10 картинок.. потом показать их пользователю.. как осуществить?

народ.. представьте, что одна картина складывается при помощи многих.. так вот, если каждую картинку показывать юзеру на экране, то, естественно всё мигает smile, так как бывает одна картинка перекрывает другую, а этого быть не должно smile

как мне сначало нарисовать картинки, а потом показать их?
я не могу себе позволить работать пиксельно с большими Array-ами, так как всё будет тормозить НА НЕТ smile

мне нужна здесь если не молнееносная реакция, то хотябы приблежение к ней..

может кто что хорошее предложит smile


--------------------
PM   Вверх
Domestic Cat
Дата 15.11.2004, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



я не понял, как нарисовать и что нарисовать? если задача в том, чтобы сделать из 10 разных картинок 1 рисунок, то нужно просто создать BufferedImage, взять у него графику (getGraphics()) и нарисовать туда эти рисунки.


--------------------

PM   Вверх
igon
Дата 16.11.2004, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если нужно, чтобы 10 отдельных картинок только "выглядели", как одна, то можно использовать JLayeredPane, разместив каждую картинку в отдельном слое, самый верхний слой предварительно "залить" каким-нибудь нейтральным фоном. По окончании загрузки всех картинок "утопить" (moveToBack) верхний слой и перерисовать JLayeredPane



--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 16.11.2004, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Окончание загрузки не означает что все картинки будут прорисовываться одновременно и не будет мерцания. В момент "утопления" верхнего слоя мы получим то же самое, что было бы при прорисовке картинок на одной панели.
Мерцание возникает из-за того, что прорисовать 10 рисунков медленнее, чем один большой. Потому лучше рисовать в один рисунок, тем более что если его составляющие со временем не меняются, то нужно будет делать эту прорисовку 1 раз. Это называется двойным буффированием.


--------------------

PM   Вверх
polosatij
Дата 16.11.2004, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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



Цитата(Domestic @ 15.11.2004, 16:28)
я не понял, как нарисовать и что нарисовать? если задача в том, чтобы сделать из 10 разных картинок 1 рисунок, то нужно просто создать BufferedImage, взять у него графику (getGraphics()) и нарисовать туда эти рисунки.



что-то не получается у меня.. где я ошибаюсь smile

Код


//сначала устанавливаем размер и тип BuffederImage
BufferedImage bi= new BufferedImage(300, 400, BufferedImage.TYPE_INT_RGB);

//затем врисовываем туда картинки:
bi.getGraphics().drawImage(im1, 0, 0, canvas); // Canvas canvas..
bi.getGraphics().drawImage(im2, 0, 0, canvas);
...

//теперь естественно содержимое нужно показать в canvas-е..

Canvas canvas= new Canvas() {
 public void paint(Graphics g) {
   
    // теперь нужен Image из BufferedImage сделать..
     // .. вот тут вот я и затрудняюсь.. я выбрал следующее:
ImageFilter filter = new CropImageFilter(0, 0, 300, 400);
Image newImage= createImage(new FilteredImageSource(bi.getSource(), filter);

    // теперь врисовываю содержимое в canvas:
g.drawImage(newImage, 0, 0, canvas);

// и на выходе получается ерунда ->
// 1. у меня рисунок был в некоторых местах транспарентным --> стал черным
// 2. смещение какое-то вправо на 50 пикселей
// 3. после перерисовки моя картинка сьезжает вправо на 30-40 пикселей..
// 4. и т.п... и т.п...
 }
};



где я ошибся?
Добавлено @ 09:08
Цитата(Domestic @ 16.11.2004, 07:11)
то нужно будет делать эту прорисовку 1 раз. Это называется двойным буффированием.


нет.. у меня не получиться этого.. картинка каждый раз - разная.. возможных вариантов 100^100, если не больше..


--------------------
PM   Вверх
Domestic Cat
Дата 16.11.2004, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Код

import java.awt.*;
import javax.swing.*;
import java.awt.image.*;

public class tst extends JFrame
{  

   public tst()
   {
       Image im1 = new ImageIcon("av-4437.jpg").getImage();
       int width = im1.getWidth(null);
       int height = im1.getHeight(null);
       setSize(300, 300);
       BufferedImage bi= new BufferedImage(300, 400, BufferedImage.TYPE_INT_RGB);
       Graphics g = bi.getGraphics();
       g.drawImage(im1, 0, 0, null);
       g.drawImage(im1, 0, height, null);
       g.drawImage(im1, width, 0, null);
       g.drawImage(im1, width, height, null);
       g.dispose();
       JPanel panel = new MyPanel(bi);
       getContentPane().add(panel, BorderLayout.CENTER);
       setVisible(true);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
   }
   
   public static void main(String args[])
   {
       new tst();
   }
   
   class MyPanel extends JPanel
   {
       private Image im;
       MyPanel(Image image)
       {
           im = image;
           setPreferredSize(new Dimension(300, 300));
       }
       
       public void paintComponent(Graphics g)
       {
           g.drawImage(im, 0, 0, null);
       }
   }
}


Насчет черного фона - нужно канве сделать setOpaque.


Цитата(polosatij @ 16.11.2004, 00:06)
нет.. у меня не получиться этого.. картинка каждый раз - разная.. возможных вариантов 100^100, если не больше..


ну так тем более



--------------------

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


Опытный
**


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

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



Никак не удается воспроизвести мерцание при отображения 10 отдельных фрагментов общей картинки (PIII-800, ОЗУ 512, Win2000, JDeveloper10) при использовании JLayeredPane. smile

Код

import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.lang.ClassCastException;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

// В каталоге Images должны быть картинки с именами 1.jpg, 2.jpg,...10.jpg,  
// Click на картинке позволяет перемещать ее по экрану
// Повторный Click отключает перемещение и добавляет очередную картинку
public class JLayeredPaneTest extends JPanel
                             implements MouseMotionListener,
                                        MouseListener {

 JLayeredPane layeredPane;
 JLabel       activLabel;
 boolean      moveEnable = false;
 String       moveOn     = "Режим перемещения включен. Кликнете на картинке для отключения";
 String       moveOff    = "Режим перемещения выключен. Кликнете на картинке для включения";
 //This is the origin of the first image added.
 Point origin = new Point(10, 20);

 //This is the offset for computing the origin for the next image
 int offset = 15;
 // Image counter
 int i = 1;

 public JLayeredPaneTest()    
   {
     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
     layeredPane = new JLayeredPane();
     layeredPane.setPreferredSize(new Dimension(800, 500));
     layeredPane.setBorder(BorderFactory.createTitledBorder(moveOff));
     layeredPane.addMouseListener(this);

     //Add several overlapping images to the layered pane
     //using absolute positioning/sizing.
     for ( i = 1; i <= 4; i++)
       {
         JLabel label = new JLabel(createImageIcon("images/"+i+".jpg"));
         label.setBounds(origin.x, origin.y, 500, 500);
         layeredPane.add(label, new Integer(i));
         origin.x += offset;
         origin.y += offset;
       }
     add(layeredPane);
   }

   /** Returns an ImageIcon, or null if the path was invalid. */
 protected static ImageIcon createImageIcon(String path)
   {
     java.net.URL imgURL = JLayeredPaneTest.class.getResource(path);
     if (imgURL != null)
       {
         return new ImageIcon(imgURL);
       }
     else
       {
         System.err.println("Couldn't find file: " + path);
         return null;
       }
   }

 public void mouseMoved(MouseEvent e)
   {
     activLabel.setLocation(e.getX(), e.getY());
   }
 public void mouseDragged(MouseEvent e) {}

 public void mouseClicked(MouseEvent e)
   {
     if (moveEnable)
       {
         layeredPane.setBorder(BorderFactory.createTitledBorder(moveOff));
         moveEnable = false;    
         layeredPane.removeMouseMotionListener(this);

         if (i<=10)
           {
             JLabel label = new JLabel(createImageIcon("images/"+i+".jpg"));
             label.setBounds(origin.x, origin.y, 500, 500);
             layeredPane.add(label, new Integer(i));
             origin.x += offset;
             origin.y += offset;
             i++;
           }
       }
     else
       {
         layeredPane.setBorder(BorderFactory.createTitledBorder(moveOn));
         moveEnable = true;    
         layeredPane.addMouseMotionListener(this);
         try
           {
             activLabel =(JLabel)layeredPane.getComponentAt(e.getX(), e.getY());      
           }
           catch (ClassCastException cce)
             {
               layeredPane.setBorder(BorderFactory.createTitledBorder(moveOff));
               moveEnable = false;    
               layeredPane.removeMouseMotionListener(this);
             }
       }
   }
   
 public void mouseReleased(MouseEvent e) {}
 public void mousePressed(MouseEvent e)  {}
 public void mouseExited(MouseEvent e) {}
 public void mouseEntered(MouseEvent e){}

   /**
    * Create the GUI and show it.  For thread safety,
    * this method should be invoked from the
    * event-dispatching thread.
    */
 private static void createAndShowGUI()
   {
     JFrame.setDefaultLookAndFeelDecorated(true);

       //Create and set up the window.
     JFrame frame = new JFrame();
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       //Create and set up the content pane.
     JComponent newContentPane = new JLayeredPaneTest();
     newContentPane.setOpaque(true); //content panes must be opaque
     frame.setContentPane(newContentPane);

       //Display the window.
     frame.pack();
     frame.setVisible(true);
   }

 public static void main(String[] args)
   {
       //Schedule a job for the event-dispatching thread:
       //creating and showing this application's GUI.
     javax.swing.SwingUtilities.invokeLater(new Runnable()
                                              {
                                                public void run()
                                                  {
                                                    createAndShowGUI();
                                                  }
                                              }
                                            );
   }
}



--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 18.11.2004, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



И не получится без дабл баффера, хоть тут в лепешку расшибись smile


--------------------

PM   Вверх
igon
Дата 18.11.2004, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

не удается воспроизвести мерцание

Цитата

И не получится без дабл баффера

=> для мерцания нужен дабл баффер

=> счастье - это когда тебя понимают smile




--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 18.11.2004, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Извиняюсь - действительно не разобрался smile но у тебя картинка прорисовывается 1 раз, и здесь то проблем нет, хоть ты ее на 100 кусков разрежь. В обеих примерах все ок.

Проблемкa будет если тебe нужнo постоянно меняtь рисунок или его части (непрерывно). Поскольку здесь речь об игре, то я предполагаю что-то вроde этогo. Тогдa прорисовыват' придется нe 1 раз, а Н раз в секунду, ну i тогда мерцание будет


--------------------

PM   Вверх
igon
Дата 18.11.2004, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мдя, похоже, я опять не совсем понял исходную проблему - подразумевалась-то, оказывается, анимация. В этом случае ты прав: о такой проблеме я слыхал и решается она как раз двойной буферизацией (сам, увы, не сталкивался). Хотя, таскание мышой одного (величиной с полэкрана) фрагмента при наличии других - чем не анимация? А мерцание так таки и не появилось, несмотря на усердие в таскании (уж и не знаю, smile или smile )


--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 18.11.2004, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Ну вроде как polosatij об игрe говорил. А насчет таскания мышой - там fps поменьше smile к тому же таскаешь ("анимируешь") ты ведь 1 рисунок, а для него двойного буфера и не надо.


--------------------

PM   Вверх
polosatij
  Дата 21.11.2004, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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



млин.. Domestic Cat, мучаюсь всё ещё с Траблой..
очень долго не мог понять где ошибка.. и теперь вижу, что перерисовка BufferedImage мне ничего не даёт.. почему-то содержание остаётся прежним.. странно.. мне нужно как-нибудь очищать содержимое BufferedImage smile , если я хочу запихнуть в него другой материал?

странно.. в paint-е всё получается замечательно (можно проверить, поменяв активное окно), а вот те же самые строчки в анонимном классе (при нажатии мыши) не работают.. хм.. smile


--------------------
PM   Вверх
Domestic Cat
Дата 21.11.2004, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



А можно код твой посмотреть? А то так непонятно.


--------------------

PM   Вверх
polosatij
  Дата 22.11.2004, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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



Код

....

 Canvas canvas = new Canvas(){
   public void paint(Graphics g){

   graphicsBI= bi.getGraphics(); // BufferedImage bi
   graphicsCanvas=g;
   getFarbe= ChessBoard.altFarbe;

   //esli nikakaja figura ne aktivna:
     if (Figuren.activeFigure.equals("")){
       graphicsBI.drawImage(im, 0, 0, canvas); //im - zadnij fon
     }else{
       //esli figura aktivna:
       imageFilterMethode(boardAltX, boardAltY);  //<- metoda mertva. boardAltX, boardAltY - prostye koordinaty polja
     }

   figuren.risujFigury(graphicsBI, arrayImage, canvas); // Image []arrayImage
   graphicsBI.dispose();

   graphicsCanvas.drawImage(bi, 28, 3, canvas);
 }

   public boolean imageUpdate(Image img, int flags, int x, int y, int width, int height) {
     if ((flags & ImageObserver.ALLBITS) != 0) {
       synchronized(monitor) {
         monitor.notify();
       }
       return false;
     }
     return true;
   }

   public void update(Graphics g){
     paint(graphicsBI);
   }

   public void repaint(){}
 };


 ....
 
     canvas.addMouseListener(new MouseAdapter(){
     public void mousePressed(MouseEvent e){
       ....
               //esli figury mogut hodit':
               if (figuren.erlaubt(feld, xCell, yCell)){
               bi.getGraphics().drawImage(im, 0, 0, canvas); //im - zadnij fon

               figuren.risujFigury(bi.getGraphics(), arrayImage, canvas);

               bi.getGraphics().dispose();
               
               //ne risuet: (v paint-e vse zamechatel'no pri pervom vyzove i pri smene aktivnogo okna)
               //(!!!) pochemu?
               graphicsCanvas.drawImage(bi, 28, 3, canvas);
               }else{
                       ChessBoard.altFarbe = getFarbe;

                       // metoda mertva: (!!!) pochemu?
                       imageFilterMethode(koordinateX, koordinateY);


                       // (!!!) pochemu?
                       figuren.risujFigury(bi.getGraphics(), arrayImage, canvas);

                       bi.getGraphics().dispose();
                       //ne risuet: (v paint-e vse zamechatel'no pri pervom vyzove i pri smene aktivnogo okna)
                       graphicsCanvas.drawImage(bi, 28, 3, canvas);
               }
               
               ....
   
   // posle vnesenija korrektur s BufferedImage <- metoda mertva:
   private void imageFilterMethode(int x, int y) {

   //vyrezaem prjamougol'nik:
   ImageFilter filter = new CropImageFilter(x-50, y-24, 80, 70); //x, y - to mesto, gde kliknuli:
   Image myNewImage= createImage(new FilteredImageSource(im.getSource(), filter));

   filter = new RGBImageFilter(){
     public int filterRGB(int x, int y, int argb){

       if (argb == getFarbe){
         return 0xfff80c17; //nahodim nuzhnym nam zvet i prevrashaem ego v krasnyj:
       }
       return argb;
     }
   };

   Image izmenenieZveta = createImage(new FilteredImageSource(myNewImage.getSource(), filter));
   
   //sm. nizhe: (smysl - narisuj, potom kokazhi (inache ne uspeesh, libo morgnet dlja pol'zovatelja:))
   threadMonitor(izmenenieZveta, canvas);

   graphicsBI.drawImage(im, 0, 0, canvas);
   graphicsBI.drawImage(izmenenieZveta, x-50, y-24, canvas);

   bi.getGraphics().dispose();
   
   //nichego ne proishodit, (!!!) pochemu?
   graphicsCanvas.drawImage(bi, 28, 3, canvas);
 }
 
 ....

   private void threadMonitor(Image im, Canvas canvas) {
   prepareImage(im, canvas);
   synchronized (monitor) {
     try {
       monitor.wait();
     }
     catch (InterruptedException ex) {}
   }
 }



млин.. не знаю.. может BufferedImage надо затерать прежде? может другой использовать? может еще что smile не знаю даже.. smile

-------------------

посмотрел вчера, оказывается в Canvas вообще ничего нарисовать нельзя!!!
может быть можно, но оно не отображается smile

Это сообщение отредактировал(а) polosatij - 22.11.2004, 14:34


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

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

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


 




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


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

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