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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод иконок для выбора, Варианты реализации 
V
    Опции темы
filipp76
  Дата 20.5.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Мне необходимо сделать диалог для выбора иконки. При нажатии на кнопку надо вывести диалог с иконками , при нажатии на иконку выполнить действие. Не знаю как грамотно это оформить. Получается сделать вывод списка(используя JList) но это жутко не удобно. Хотелось бы сделать что-то наподобие выбора смайликов на нашем форуме. Тоесть окошко, в нем картинки, например 3х3(если картинок 9). При всем этом надо чтоб количество иконок менялось динамически. Подкиньте пожалуйста идею для реализации данной задачи. Заранее спасибо!
PM MAIL WWW ICQ   Вверх
w1nd
Дата 21.5.2007, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Вот наиболее простой вариант: JList в JScrollPane, элементы - значки, также потребуется некоторая настройка спика:
Код
    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    list.setVisibleRowCount(-1);

Можно еще и свой рендерер назначить (чтобы сделать бордюр вокруг значков, центрировать их и прочее)

Это сообщение отредактировал(а) w1nd - 21.5.2007, 01:14


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


Бывалый
*


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

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



Буду пробовать сегодня, спасибо.
PM MAIL WWW ICQ   Вверх
filipp76
Дата 21.5.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не получается у меня сделать класс с JInternalFrame, его хочу выводить внутри формы и там уже выводить диалог с иконками(пока буду пробовать реализовать его с помощью JList). Помогите пожалуйста сделать заготовку класса с помещенным в него JList smile . И еще у меня вопросик, можно ли выводить JInternalFrame на определенном месте формы? И как сделать чтоб нельзя было его двигать... Заранее спасибо!
PM MAIL WWW ICQ   Вверх
filipp76
Дата 21.5.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(w1nd @  21.5.2007,  01:13 Найти цитируемый пост)
    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);    list.setVisibleRowCount(-1);

Спасибо, тоже использовал, очень помогло!

Пробую сделать сам, вот что получается, помогайте пожалуйста...
Собственно главный класс
Код

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.*;

public class ClIconList {
private static DefaultListModel listModel;
private static JList list;
        
  public static void main(final String args[]) {
    JFrame frame = new JFrame("Selection Icons");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    list = new JList();
    listModel = new DefaultListModel();
    list.setCellRenderer(new ImageListCellsRedender());
    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    list.setVisibleRowCount(-1);
    list.setModel(listModel);
    
    JScrollPane sp1 = new JScrollPane(list);
    sp1.setColumnHeaderView(new JLabel("List"));
    
    frame.add(sp1, BorderLayout.CENTER);
    frame.setSize(300, 200);
    frame.setVisible(true);
   
    addIcons(4);
  }
  
 private static void SetUListItem(String item,String iconName){
 Icon i = new ImageIcon(ClIconList.class.getResource("iconName"));  
 ImageListElement im= new ImageListElement(i,item); 
 listModel.addElement(im);
 list.setModel(listModel);
 list.setCellRenderer(new ImageListCellsRedender());
}
    
 private static void addIcons(int IconCount){
  for(int i=0;i<IconCount;i++){  
    SetUListItem("",Integer.toString(i)+".png");   
  }   
 }
 
 
 }


Дополнительные классы
Код

import javax.swing.Icon;

public class ImageListElement {
    public Icon icon;
    public String text;
    
    /** Creates a new instance of ImageListElement */
    public ImageListElement(Icon i, String s) {
        icon  = i;
        text = s;
    }

  public String getListText(){
   return(text);   
  }

}


Рендерер

Код

import java.awt.Component;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JList;


public class ImageListCellsRedender extends javax.swing.DefaultListCellRenderer {
    
    /** Creates a new instance of ImageListCellsRedender */
    public ImageListCellsRedender() {
    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

        if (value instanceof ImageListElement) {
            ImageListElement elem = (ImageListElement) value;
            Icon i = elem.icon;
            String s = elem.text;
            JLabel l = (JLabel) super.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
            l.setIcon(i);
            return l;
        }
        
       return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

    }
    

}


Рассказываю что не получается.
1.Я хотел повесить этот JList на JInternalFrame(хочу использовать её в качестве выпадающего меню) но не знаю как правильно написать класс, все что получилось это повесить на JFrame.
2.Не работает эта строка
Код

 Icon i = new ImageIcon(ClIconList.class.getResource("iconName"));

Если вписываю сам имя иконки, например "0.png", то все работает, иконка отображается.
3.Если получится пересадить мой JList на JInternalFrame тогда:
 a)как вывести JInternalFrame в определенном месте формы?
 б)как сделать его неподвижным, чтоб пользователь не мог его двигать? Просто появляется, юзер тыкает в иконку и он закрывается.

Я очень стараюсь smile , помогите пожалуйста, осталось совсем не много разобратся.


Это сообщение отредактировал(а) filipp76 - 21.5.2007, 21:45
PM MAIL WWW ICQ   Вверх
w1nd
Дата 21.5.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(filipp76 @  21.5.2007,  21:12 Найти цитируемый пост)
Я хотел повесить этот JList на JInternalFrame(хочу использовать её в качестве выпадающего меню) но не знаю как правильно написать класс, все что получилось это повесить на JFrame.

JInternalFrame подобен JFrame, поэтому туда компоненты вставляются так же. Вот только я не уверен, что можно безболезненно поместить JInternalFrame в контейнер, отличный от JDesktopPane - не пробовал (там очень много прибитых гвоздями взаимосвязей).

Цитата(filipp76 @  21.5.2007,  21:12 Найти цитируемый пост)
Не работает эта строка
<...>
Если вписываю сам имя иконки, например "0.png", то все работает, иконка отображается

Где находится файл 0.png относительно класса? Какова вообще структура пакетов?

Цитата(filipp76 @  21.5.2007,  21:12 Найти цитируемый пост)
как вывести JInternalFrame в определенном месте формы?

Добавить его в контейнер и установить bounds.

Цитата(filipp76 @  21.5.2007,  21:12 Найти цитируемый пост)
как сделать его неподвижным, чтоб пользователь не мог его двигать? Просто появляется, юзер тыкает в иконку и он закрывается.

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


Это сообщение отредактировал(а) w1nd - 21.5.2007, 23:08


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


Бывалый
*


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

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



Цитата(w1nd @  21.5.2007,  23:08 Найти цитируемый пост)
Где находится файл 0.png относительно класса? Какова вообще структура пакетов?

файлы находятся в *.jar

Цитата(w1nd @  21.5.2007,  23:08 Найти цитируемый пост)
Добавить его в контейнер и установить bounds.

Не знаю как это делается, можно маленький примерчик?

Цитата(w1nd @  21.5.2007,  23:08 Найти цитируемый пост)
Опять же, это тоже довольно прочно прибито гвоздями в реализации UI для заголовка JInternalFrame. Вам проще будет вместо него использовать обычную панель, с заголовком из метки и кнопки.


Мне заголовок вообще не нужен, надо пространство заполненое иконками с возможностью их выбора(обработать нажатие на них).
PM MAIL WWW ICQ   Вверх
fixxer
Дата 22.5.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



http://www.java2s.com/Code/Java/Swing-Comp...ingComboBox.htm
Не подойдет? Можно оттуда выдрать формирование панели с иконками.


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


Бывалый
*


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

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



Цитата(fixxer @  22.5.2007,  14:36 Найти цитируемый пост)
http://www.java2s.com/Code/Java/Swing-Comp...ingComboBox.htmНе подойдет? Можно оттуда выдрать формирование панели с иконками.

Огромное спасибо, єто то что надо!!! + тебе!
Но возникла проблема как прилепить этот компонент к NetBeans smile 

Это сообщение отредактировал(а) filipp76 - 22.5.2007, 20:13
PM MAIL WWW ICQ   Вверх
filipp76
Дата 22.5.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.*;

public class ClIconList {
private static DefaultListModel listModel;
private static JList list;
        
  public static void main(final String args[]) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    frame.setUndecorated(true);
    list = new JList();
    listModel = new DefaultListModel();
    list.setCellRenderer(new ImageListCellsRedender());
    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    list.setVisibleRowCount(-1);
    list.setModel(listModel);
    
    JScrollPane sp1 = new JScrollPane(list);
   //sp1.setColumnHeaderView(new JLabel("List"));
    frame.setBounds(370,513, 370,513);
    frame.add(sp1, BorderLayout.CENTER);
    frame.setSize(200, 150);
    frame.setVisible(true);
   
    addIcons(4);
  }
  
 private static void SetUListItem(String item,String iconName){
 Icon i = new ImageIcon(ClIconList.class.getResource(iconName));  
 ImageListElement im= new ImageListElement(i,item); 
 listModel.addElement(im);
 list.setModel(listModel);
 list.setCellRenderer(new ImageListCellsRedender());
}
    
 private static void addIcons(int IconCount){
  for(int i=0;i<IconCount;i++){  
    String IconName=Integer.toString(i)+".png";
    SetUListItem("",IconName);   
  }   
 }
 
 
 }


Рендерер

Код

import java.awt.Component;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JList;


public class ImageListCellsRedender extends javax.swing.DefaultListCellRenderer {
    
    /** Creates a new instance of ImageListCellsRedender */
    public ImageListCellsRedender() {
    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

        if (value instanceof ImageListElement) {
            ImageListElement elem = (ImageListElement) value;
            Icon i = elem.icon;
            String s = elem.text;
            JLabel l = (JLabel) super.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
            l.setIcon(i);
            return l;
        }
        
       return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

    }
    

}


Код

import javax.swing.Icon;

public class ImageListElement {
    public Icon icon;
    public String text;
    
    /** Creates a new instance of ImageListElement */
    public ImageListElement(Icon i, String s) {
        icon  = i;
        text = s;
    }

  public String getListText(){
   return(text);   
  }


}


Мне данного варианта достаточно НО!!!
У меня не грузяться иконки в *.gif(анимированые) формате!!, никаких ошибок не выдается но вместо них пустое белое место, как бы свое место они занимают но кратинки нет..((. Я уже подумал что компоненты их не поддерживают но запихнув иконку в JLabel все отображается и работает. Помогите решить проблемму, это последняя преграда у меня..

Это сообщение отредактировал(а) filipp76 - 22.5.2007, 21:34
PM MAIL WWW ICQ   Вверх
filipp76
Дата 23.5.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Может надо рендерер переписать, чтоб отображались *.gif?
PM MAIL WWW ICQ   Вверх
filipp76
Дата 23.5.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ничего непонимаю, вешаю на форму JLabel через setIcon устанавливаю анимированый *.gif, все прекрасно работает, тогда почему у меня не работает, ведь иконка вешается на JLabel!!??
Код

 JLabel l = (JLabel) super.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
 l.setIcon(i);[/B]



PM MAIL WWW ICQ   Вверх
w1nd
Дата 23.5.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(filipp76 @  23.5.2007,  17:22 Найти цитируемый пост)
Ничего непонимаю, вешаю на форму JLabel через setIcon устанавливаю анимированый *.gif, все прекрасно работает, тогда почему у меня не работает, ведь иконка вешается на JLabel!!??

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

Вам нужно после создания ImageIcon устанавливать им список в качестве наблюдателя:
Код
icon = new ImageIcon(...);
icon.setImageObserver(list);


Это, между прочим, написано в javadoc'е для класса ImageIcon ;)

Это сообщение отредактировал(а) w1nd - 23.5.2007, 18:05


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


Бывалый
*


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

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



Цитата(w1nd @  23.5.2007,  17:55 Найти цитируемый пост)
icon = new ImageIcon(...);icon.setImageObserver(list);

Проблема решена! Цель достигнута! Всем спасибо! smile 
PM MAIL WWW 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.1078 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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