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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Картинки и надписи в JList. 
:(
    Опции темы
ShurikA
Дата 18.5.2006, 04:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



На эту тему я нашёл вот этот топик:
http://forum.vingrad.ru/index.php?showtopi...=1&hl=jlist
но это не совсем то.
Мне нужно создать списокс картинками и надписями, но так что бы он был динамичен.
то есть нужно каким то образом воспользоваться DefaulListModel.
но я не могу догнать как... 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
batigoal
Дата 18.5.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Что ты подразумеваешь под динамичностью? 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ShurikA
Дата 18.5.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Возможность добовлять и убирать элементы. 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
batigoal
Дата 18.5.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Цитата(ShurikA @  18.5.2006,  15:06 Найти цитируемый пост)
Возможность добовлять и убирать элементы. 

Это никак не привязано к отрисовке элементов. За отрисовку отвечает рендерер, за содержимое - модель. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ShurikA
Дата 18.5.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



 smile Тогда я чегото совсем запутался... 
Веть модел должна рендеру "сказать" как отрисовываться... 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
batigoal
Дата 18.5.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Отнюдь. Модель про это ничего не знает.

Так ты пробовал делать удаление? 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ShurikA
Дата 18.5.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Я расскажу что я делал обычно с JList:

Код

...
DefaultListModel listModel = new DefaultListModel();
JList list = new JList(listModel);
.
.
.
//Добавление
File[] files = currentDir.listFiles();

for(int i=0; i<files.length; i++)
{
   if(accept(files[i]))
   {
      listModel.addEllement(files[i]); 
   }
}
.
.
.


Таким образом в список выдаются полные пути фаилов.

Теперь...
Нужно всё тоже самое но вместо путей фаилов нужны сгенерированные из них иконки (на это функция уже работает) и название фаила. 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
batigoal
Дата 18.5.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Тогда бери пример из топика по твоей ссылке - и вперед! smile
Модель там не затрагивается.

http://forum.vingrad.ru/index.php?showtopi...st&p=688603 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ShurikA
Дата 18.5.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Ну как ты видишь это то что я и сделал.
Но у меня чего то не сошлось...  smile

Добавлено @ 16:25 
И ещё одно:
Сказать тебе честно, я не совсем понимаю логику этого примера. Так что просто подогнал как есть и соответственно не заработало. 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 18.5.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Я только одно совсем не понял.
В моём случае, кому я должен переделывать "Rednderer" JList или ListModel?
 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
batigoal
Дата 18.5.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Рендерер. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ShurikA
Дата 18.5.2006, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Lamer George, 
Извини, но я не понял твоего ответа... 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
powerOn
Дата 19.5.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



ShurikA, здесь несложная логика.
Есть компонент JList. Этот компонент агрегирует объект реализующий интерфейс  ListCellRenderer или наследованный от javax.swing.DefaultListCellRenderer. DefaultListCellRenderer тоже релизует интерфейс  ListCellRenderer и обладает его реализацией, так сказать, по умолчанию.

Так вот, ты можешь написать свой класс, который будет реализовывать интерфейс ListCellRenderer. Создать объект этого класса и передать (установить) его объекту JList. JList когда захочет перерисовать свой элементы, обратится к агрегированному в нем ListCellRenderer-у, и вызовет его метод: public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus). А твой код, в зависимости от переданных в метод параметров,  вернет ему компонент, который и будет прорисован в качестве элемента JList.  

Это сообщение отредактировал(а) MoonCat - 19.5.2006, 11:54


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
ShurikA
Дата 19.5.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Написал я вот так:
Код

package octopusuploader;

import javax.swing.*;
import java.awt.Component;
import java.io.File;
import java.awt.Image;
import java.awt.Color;

/**
 * <p>Title: Octopus Uploader</p>
 *
 * <p>Description: Multi-File Uploader</p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: MSHWeb LTD.</p>
 *
 * @author Alex Agulyansky
 * @version 1.0
 */
public class FileThumbCellRenderer
    extends DefaultListCellRenderer {
  
  public FileThumbCellRenderer() {
  }
  
  public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
  {
    Image img;
    ImgJLabel lbl = new ImgJLabel();
    File file = (File) value;
    //lbl = (ImgJLabel) super.getListCellRendererComponent(list, file.getName(), index, isSelected, cellHasFocus);
    lbl.setText(file.getName());
      
    if(file.isDirectory())
    {
      img = new ImageIcon(getClass().getResource("FOLDER.jpg")).getImage();
      lbl.setImg(img);
    }
    
    if(isSelected)
    {
      lbl.setBorder(BorderFactory.createLineBorder(Color.BLUE,3));
    }
    
    return lbl;
  }
}


как результат:
1. Картинка отображается.
2. Текст нет.
3. Когда пытаюсь отметить, ничего не происходит. 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 19.5.2006, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Попробуй так:
Код
public class FileThumbCellRenderer extends DefaultListCellRenderer
{
  private ImageIcon folderIcon = new ImageIcon(getClass().getResource("folder.jpg"));
  private ImageIcon fileIcon = new ImageIcon(getClass().getResource("file.jpg"));

  public FileThumbCellRenderer()
  {
  }

  @Override
  public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
  {
    File file = (File) value;

    setText(file.getName());

    if(file.isDirectory())
      setIcon(folderIcon);
    else
      setIcon(fileIcon);

    if(isSelected)
      setBorder(BorderFactory.createLineBorder(Color.BLUE, 3));

    return this;
  }
}
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 20.5.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Тоже самое 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
powerOn
Дата 20.5.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



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


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
ShurikA
Дата 20.5.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Всё проверял, всё правильно.
Прото не отображается. 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 20.5.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Вот такой код у меня работает:
Код
import java.io.*;
import java.awt.*;
import javax.swing.*;

public class FileThumbCellRenderer extends DefaultListCellRenderer  
{   
  private ImageIcon folderIcon = new ImageIcon("folder.jpg");
  private ImageIcon fileIcon = new ImageIcon("file.jpg");
  
  public FileThumbCellRenderer()    
  { 
  } 

  @Override 
  public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)  
  { 
    File file = (File) value;

    setText(file.getName());

    if(file.isDirectory())
      setIcon(folderIcon);  
    else    
      setIcon(fileIcon);

    if(isSelected)  
      setBorder(BorderFactory.createLineBorder(Color.BLUE, 3));

    return this;    
  } 

  public static void main(String[] args)
  {
    Object[] data = new Object[]{new File("C:\\"), new File("file.jpg"), new File("folder.jpg")};
    JList list = new JList(data);
    list.setCellRenderer(new FileThumbCellRenderer());

    JFrame frame = new JFrame("Tree");
    frame.getContentPane().add(new JScrollPane(list));
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}


Проблема где-то в другом месте. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 20.5.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



LSD
Я пока сделал другим путём.
Допишу покажу.

Добавлено @ 17:26 
Ещё вопрос связан с тем же:
Как заставить JLabel высвечивать текст в несколко строк? 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
w1nd
Дата 20.5.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Цитата(ShurikA @ 20.5.2006,  17:18)
Как заставить JLabel высвечивать текст в несколко строк?

Самое простое - HTML в качестве текста. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
ShurikA
Дата 20.5.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Сделал, Работает!!!
но вот с такой бедой:
Код

Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space

Что это и как с этом бороться?

В лист я пихаю вот такие элементы:
Код

package octopusuploader;

import javax.swing.*;
import java.io.File;
import java.awt.FlowLayout;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.GridLayout;

/**
 * <p>Title: Octopus Uploader</p>
 *
 * <p>Description: Multi-File Uploader</p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: MSHWeb LTD.</p>
 *
 * @author Alex Agulyansky
 * @version 1.0
 */
public class FileIcon
    extends JPanel {
  private JPanel preview;
  private JLabel name;
  private ImgJLabel icon = new ImgJLabel();
  private long fileSizeLimit = 8000000;

  public FileIcon(File f) {
    super(new FlowLayout());
    Dimension dm = new Dimension(93,93);
    this.setPreferredSize(dm);
    this.setMaximumSize(dm);
    this.setMinimumSize(dm);
    this.setBackground(Color.white);
    this.setToolTipText(f.getName());

    preview = new JPanel(new GridLayout(1,1), false);
    dm.setSize(80,80);
    preview.setPreferredSize(dm);
    preview.setMaximumSize(dm);
    preview.setMinimumSize(dm);
    preview.setBackground(Color.white);

    if (f.isDirectory()) {
      icon.setImg(new ImageIcon(getClass().getResource("Images/FOLDER.jpg")).getImage());
    }
    else if(f.isFile())
    {
      String exten = this.getExtension(f);
      if(exten != null)
      {
        if (exten.equals("pdf")) {
          icon.setImg(new ImageIcon(getClass().getResource("Images/PDF.jpg")).getImage());
        }
        else if (exten.equals("psd")) {
          icon.setImg(new ImageIcon(getClass().getResource("Images/PHOTOSHOP.jpg")).
                      getImage());
        }
        else if (exten.equals("tif") ||
                 exten.equals("tiff")) {
          icon.setImg(new ImageIcon(getClass().getResource("Images/TIFF.jpg")).
                      getImage());
        }
        else if (exten.equals("gif") ||
          exten.equals("jpeg") ||
          exten.equals("jpg") ||
          exten.equals("png") ||
          exten.equals("bmp")) {
          if (f.length() < fileSizeLimit || fileSizeLimit == 0) {
            icon.setImg(new ImageIcon(f.getPath()).getImage());
          }
          else
          {
            icon.setImg(new ImageIcon(getClass().getResource("Images/PICS.jpg")).
                      getImage());
          }
        }
      }
    }
    preview.add(icon);

    name = new JLabel(f.getName());

    this.add(preview);
    this.add(name);
  }

  //Get the extension of a file.
  private String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 && i < s.length() - 1) {
      ext = s.substring(i + 1).toLowerCase();
    }
    return ext;
  }

}


ImgJLabel :
Код

package octopusuploader;

import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.awt.Image;

/**
 * <p>Title: Octopus Uploader</p>
 *
 * <p>Description: Multi-File Uploader</p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: MSHWeb LTD.</p>
 *
 * @author Alex Agulyansky
 * @version 1.0
 */
public class ImgJLabel extends JLabel {
  private Image img = null;

  public ImgJLabel() {
    super(new ImageIcon(), JLabel.CENTER);
  }

  public void setImg(Image image){
    img = image;
    repaint();
  }

  public void paint(Graphics g){
    if(img != null){
      ImageIcon temp = new ImageIcon(img);
      float ratio;
      int width = temp.getIconWidth();
      int height = temp.getIconHeight();
      temp = null;
      int x, y;

      if (width >= height && width > getWidth()) {
        ratio = (float)height / (float)width;
        width = getWidth();
        height = (int)((float)width * ratio);
      }
      else if (height > width && height > getHeight()) {
        ratio = (float)width/(float)height;
        height = getHeight();
        width = (int)((float)height * ratio);
      }
      x = getWidth() / 2 - width / 2;
      y = getHeight() / 2 - height / 2;

      g.drawImage(img, x, y, width, height, this);
    }
  }


}
 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
powerOn
Дата 20.5.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(ShurikA @  20.5.2006,  22:52 Найти цитируемый пост)
но вот с такой бедой:
Выделить всёБез подсветки
1:
    
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space

Что это и как с этом бороться?


Это означает, что куча (динамическая память) выделенная под твою JVM истощилась. 
Чтобы подобное не повторилось следует выделить JVM больше памяти. Запускай JVM с ключом -XmxZZZm, где ZZZ - необходимое количество памяти.

например: java - jar -Xmx256m MyProgram.jar 
Так ты разрешишь JVM использовать до 256 мегабайт ценной памяти...
  

Это сообщение отредактировал(а) MoonCat - 20.5.2006, 22:17


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
ShurikA
Дата 20.5.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



А что если это апплет который запускаетя не у меня  smile  


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 20.5.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Можно ли как то это обойти? Или увеличить эту память OnLine?
Думаю что это происходит из за масштабирования картинок в иконки.
Я это делаю так:
Код

package octopusuploader;

import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.awt.Image;

/**
 * <p>Title: Octopus Uploader</p>
 *
 * <p>Description: Multi-File Uploader</p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: MSHWeb LTD.</p>
 *
 * @author Alex Agulyansky
 * @version 1.0
 */
public class ImgJLabel extends JLabel {
  private Image img = null;

  public ImgJLabel() {
    super(new ImageIcon(), JLabel.CENTER);
  }

  public void setImg(Image image){
    img = image;
    repaint();
  }

  public void paint(Graphics g){
    if(img != null){
      ImageIcon temp = new ImageIcon(img);
      float ratio;
      int width = temp.getIconWidth();
      int height = temp.getIconHeight();
      temp = null;
      int x, y;

      if (width >= height && width > getWidth()) {
        ratio = (float)height / (float)width;
        width = getWidth();
        height = (int)((float)width * ratio);
      }
      else if (height > width && height > getHeight()) {
        ratio = (float)width/(float)height;
        height = getHeight();
        width = (int)((float)height * ratio);
      }
      x = getWidth() / 2 - width / 2;
      y = getHeight() / 2 - height / 2;

      g.drawImage(img, x, y, width, height, this);
    }
  }


}


Какие ещё способы есть, поэкономнее? 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 21.5.2006, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Решил проблемму памяти тем что каждый раз после прорисовки оменьшенной картинки, то есть вот тут:
Код

public void paint(Graphics g){
...
...
тут
}


в ручную освобождаю память, вот так:
Код

img.flush();


всё работает, не затыкаеться, но дико медленно. 
Каждый раз кода хочу отметить элемент или прокрутить список забиваеся 97% проца  smile  


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
batigoal
Дата 21.5.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Цитата(ShurikA @  21.5.2006,  04:23 Найти цитируемый пост)
всё работает, не затыкаеться, но дико медленно. 
Каждый раз кода хочу отметить элемент или прокрутить список забиваеся 97% проца  smile   

Значит, стоит пересмотреть подход. Например, уменьшить картинки один раз, и хранить их уже в обработанном виде. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 21.5.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Ты масштабируешь иконки прямо в методе paint(), удивительно что у тебя вообще список отрисовывается.

Сделай так:
- создаешь объект FileThumbnail
Код
public class FileThumbnail
{
  private Image icon;
  private File file;

  public FileThumbnail(File file) throws IOException
  {
    this.file = file;
    icon = ImageIO.read(file);
    icon = icon.getScaledInstance(1, 1, BufferedImage.SCALE_SMOOTH);
    icon.flush();
  }

  public Image getIcon()
  {
    return icon;
  }

  public File getFileName()
  {
    return file;
  }
}

- при открытии директории создаешь FileThumbnail для всех картинок в папке
- заносишь сгенерированные FileThumbnail в JList 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 21.5.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Цитата(LSD @  21.5.2006,  09:52 Найти цитируемый пост)
- при открытии директории создаешь FileThumbnail для всех картинок в папке

Это же займёт ворох времени... 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
batigoal
Дата 21.5.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Цитата(ShurikA @  21.5.2006,  15:37 Найти цитируемый пост)
Это же займёт ворох времени...  

Зато один раз.

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


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 21.5.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(ShurikA @  21.5.2006,  15:37 Найти цитируемый пост)
Это же займёт ворох времени... 

А ты посмотри как работает тот же ACDSee или Проводник в режиме Эскизы страниц, тоже самое. Вначале долгое и утомительное построение превьюшек, и только потом работа. Если хочешь можешь сохранять в директории свой собсвенный Thumbs.db это сделать не сложно, тогда в следующий раз открываться будет быстрее.
Если хочешь работу можно ускорить работу, вначале создав список FileThumbnail без иконок (а лучше с умолчальной иконкой, для каждого типа файлов) и показать его пользователю, а в фоне подгружать превьюшки. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 21.5.2006, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Цитата(Lamer George @  21.5.2006,  14:06 Найти цитируемый пост)
Зато один раз.

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

В таком случае если человек гуляет по всему компу, то в какойто момент точно не хватит памяти... 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 21.5.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Цитата(LSD @  21.5.2006,  15:00 Найти цитируемый пост)
Если хочешь работу можно ускорить работу, вначале создав список FileThumbnail без иконок (а лучше с умолчальной иконкой, для каждого типа файлов) и показать его пользователю, а в фоне подгружать превьюшки.  

Прекрасная идея, я на самом деле в начале хотел сделалть именно так.
Но так и не понял как это сделать? Я же пользуюсь CellRenderer. А он вузывается не зависимо от меня, и как я на фоне работы к нему подбираюсь что бы подгружать превюшки?
Потому как теоретический всё понятно:
1. Создать список с дефолтовыми иконами.
2. Передать этот же список потоку который в своё время, не мешая пользователю, будет эти иконы менять на превьюшки.

Только при таком построении которое у меня я не имею представления как это сделатьsmile 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 21.5.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



1. создал список с дефолтовыми иконками и передал его модели JList, а еще лучше чтобы это выполнялось непосредсвенно в самой модели
2. запустил фоновый Tread по созданию превьюшек
3. процесс генерирует превьюшку для файла и меняет у FileThumbnail иконку, плюс оповещает список что такой-то элемент поменялся ( fireContentsChanged() )
4. все остальное сделает JList и CellRenderer

Добавлено @ 22:19 
Если трудности останутся, то я попробую завтра накидать приблизительный код, который это делает. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 21.5.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Я конеч попробыю, но честно тебе сказать я не совсем понял как?
Извини за тормознутость...

Добавлено @ 22:26 
Неужели ты хочешь сказать что нужно сделать столько потоков сколько и иконок?
Если делать непосредственно в модели? 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 21.5.2006, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Приблизительно, это выглядит так:
Код
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.ArrayList;

public class ThumbnailListModel extends AbstractListModel
{
  private ArrayList<FileThumbnail> thumbnails;
  private Image defaultImage;

  public ThumbnailListModel(File direcory) throws IOException
  {
    thumbnails = new ArrayList<FileThumbnail>();
    defaultImage = ImageIO.read(new File("default.gif"));
    setDirectory(direcory);
  }

  private void setDirectory(File direcory) throws IOException
  {
    int index = getSize();
    thumbnails.clear();
    fireIntervalRemoved(this, 0, index);

    for(File file : direcory.listFiles())
      thumbnails.add(new FileThumbnail(file, defaultImage));

    fireIntervalAdded(this, 0, thumbnails.size());

    runThumbnailGenration();
  }

  private void runThumbnailGenration()
  {
    Runnable thumbnailGenerator = new Runnable()
    {
      public void run()
      {
        int len = thumbnails.size();
        for(int i = 0; i < len; i++)
        {
          FileThumbnail thumbnail = thumbnails.get(i);
          Image thumbnailImage = null;
          //generate thumbnail
          thumbnail.setIcon(thumbnailImage);
          fireContentsChanged(ThumbnailListModel.this, i , i);
        }
      }
    };

    Thread thread = new Thread(thumbnailGenerator, "ThumbnailGenerator");
    thread.setPriority(Thread.MIN_PRIORITY);
    thread.setDaemon(true);
    thread.run();
  }

  public int getSize()
  {
    return thumbnails.size();
  }

  public Object getElementAt(int index)
  {
    return thumbnails.get(index);
  }

  public static class FileThumbnail
  {
    private Image icon;
    private File file;

    public FileThumbnail(File file, Image icon) throws IOException
    {
      this.file = file;
      this.icon = icon;
    }

    public Image getIcon()
    {
      return icon;
    }

    public void setIcon(Image icon)
    {
      this.icon = icon;
    }

    public File getFile()
    {
      return file;
    }

    public void setFile(File file)
    {
      this.file = file;
    }
  }
}
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 21.5.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Короче говоря так и есть... Столько потоков сколько фаилов... 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 21.5.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Поток один. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 21.5.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



а да, стормозил.
Спасибо, буду пробовать...

Добавлено @ 23:27 
На сколько я понимаю, если сделать так как ты показал не надо перекапывать CellRenderer, а просто оставить его дефолтом. 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 22.5.2006, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



LSD, 
Сделал по твоей подсказке:
Работает, доже н плохо.
Но, такое ощущение что поток не автономный.
То есть пока не переделываются все превьюшки прога не продолжает работать.
Вот код, покопай если не лень.  smile  

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  OctopusUploaderV31.zip 48,68 Kb


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 22.5.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(ShurikA @  22.5.2006,  06:58 Найти цитируемый пост)
Работает, доже н плохо.
Но, такое ощущение что поток не автономный.
То есть пока не переделываются все превьюшки прога не продолжает работать.

Угу, ошущение верное smile У меня ошибка в 54 строке, там вместо thread.run(), надо было писать thread.start().

В твоем коде, пока еще не разобрался. Посмотрю чуть попозже. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 23.5.2006, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Только не пугайся, там много бардак и много всякого не нужного хлама..

С thread.start() работает smile
Спасибо!!!! 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 23.5.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Всё таки до сих пор есть проблемма с памятью.
Если долго работать с апплетом  smile  


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 23.5.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



С кодом я так и не разобрался, много классов и называются совсем неочевидно (типа: FileListModel на самом деле List, а не модель).

Я обнаружил, что если использовать Image.getScaledInstance(), то исходное изображение не освобождает память, даже после flush(). Поэтому лучше использовать AffineTransformOp. 
Я накидал примерчик такого JList-а. Директорию с 104 файлами, общим объемом 310Мб, переваривает и занимает около 4 мегов после этого. 

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  Thumbnail.zip 2,75 Kb


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 23.5.2006, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


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

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



Цитата(LSD @  23.5.2006,  22:07 Найти цитируемый пост)
AffineTransformOp

Это дело проще а С++ написать...
Спасибо!!!
Как тебе вообще общее впечатление от проекта? smile 
Это мой первый на Джаве.
Имею в виду что надо бы изменить в моём подходе? потому как то что надо это точно... 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.2043 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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