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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список 
V
    Опции темы
Scatman
Дата 30.3.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно ли в список в одну строку поместить и картинку и текст
PM MAIL   Вверх
LSD
Дата 30.3.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Можно, смотри в сторону ListCellRenderer.


--------------------
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   Вверх
powerOn
Дата 30.3.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Вот небольшой примерчик. smile
Определяем класс для элемента списка с картинкой.

Код

import javax.swing.Icon;

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


Создаем свой ListCellRedender. отвечающий за прорисовку элементов списка.

Код


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;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JList;

public class Main {
    

    public Main() {
    }
    
    private static Icon i = new ImageIcon("bullet.gif");
    private static Object[] data = {
        new ImageListElement(i, "aaaaa"),
        new ImageListElement(i, "bbbbb")
    };

    public static void main(String[] args) {
        
        JFrame f = new JFrame();
        JList list = new JList(data);
        list.setCellRenderer(new ImageListCellsRedender());
        f.getContentPane().add(list);
        f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
    
}




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

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


Новичок



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

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



Всем спасибо помогли!!!! smile
PM MAIL   Вверх
powerOn
Дата 30.3.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



нЕзачто, заходи еще. smile


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

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


Шустрый
*


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

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



 smile 
Все выше сказанное понятно, тоесть как это делать по готовому массиву данных.
А как потом реализовать динамическое заполнение списка, например по нажатию кнопки?
Помогите кто знает, а то уже пару дней мучаюсь.
PM MAIL   Вверх
BlackStar
Дата 17.12.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно использовать DefaultListModel или создать свою модель расширяя AbstractListModel.


Код

   DefaultListModel listModel = new DefaultListModel();
   JList list = new JList(listModel);

   listModel.add("1 element");
   listModel.add("2 element"); 


PM MAIL Jabber   Вверх
MOFA
  Дата 17.12.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(BlackStar @ 17.12.2006,  23:15)
Можно использовать DefaultListModel или создать свою модель расширяя AbstractListModel.


Да, это тоже понятно, но так у меня получилось добавлять элементы одного типа, а как
можно добавлять например иконку, а после нее текст (в одну строчку) ?
PM MAIL   Вверх
BlackStar
Дата 18.12.2006, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так все тоже самое, только вместо строк добавляй указынный выше ImageListElement.

ЗЫ. Естесственно при этом нужно также использовать ListCellRedender к нему.
PM MAIL Jabber   Вверх
powerOn
Дата 18.12.2006, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(MOFA @  17.12.2006,  23:35 Найти цитируемый пост)
можно добавлять например иконку, а после нее текст (в одну строчку) ? 

плохо понимаю проблему. 

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

Цитата(MOFA @  17.12.2006,  22:45 Найти цитируемый пост)
А как потом реализовать динамическое заполнение списка, например по нажатию кнопки?

Измените модель. Напимер создайте другой массив с элементами ImageListCellsRedender() и установите его jList-у. Можете поменять "контейнер": вместо массива использовать Vector.  Можете написать свой класс для элемента списка вместо ImageListCellsRedender, но он должен быть согласован с рендерером.



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

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


Шустрый
*


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

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



Я делаю это так:

ReportListElement.java
Код

package UIForms.ReportList;

import utils.myImageIcon;

import javax.swing.*;

public class ReportListElement {

    private String reportMessage;
    private ImageIcon reportIcon;
    private String messageType;

    public ReportListElement (String message, String type) {
        setReportMessage(message);
        setMessageType(type);
        setReportIcon(type);
    }

    public String toString() {

        return "[" + messageType + "] " + reportMessage;
    }

    public String getReportMessage() {
        return reportMessage;
    }

    public void setReportMessage(String reportMessage) {
        this.reportMessage = reportMessage;
    }

    public ImageIcon getReportIcon() {
        return reportIcon;
    }

    public void setReportIcon(String messType) {
        this.reportIcon = new myImageIcon().getImageIcon("resources/images/icons/" + messType + ".icon.gif");
    }

    public void setReportIcon(ImageIcon reportIcon) {
        this.reportIcon = reportIcon;
    }

    public String getMessageType() {
        return messageType;
    }

    public void setMessageType(String messageType) {
        this.messageType = messageType;
    }

}



ReportListCollection.java
Код

package UIForms.ReportList;

import java.util.Vector;

public class ReportListCollection {

    private Vector collection;
    private int numMessages;

    ReportListCollection () {
        collection= new Vector();
        numMessages= 0;
    }

    public void addMessage (ReportListElement mess) {

        //System.out.println("addMessage"); //todo: del

        collection.add(numMessages, mess);
        this.numMessages ++;
    }

    public Vector getCollection() {
        return collection;
    }

    public void setCollection(Vector col) {
        this.collection= col;
    }

    public int getNumMessages() {
        return numMessages;
    }
}


ReportListModel.java
Код

package UIForms.ReportList;

import javax.swing.*;
import javax.swing.event.ListDataListener;
import java.util.Vector;

public class ReportListModel extends DefaultListModel {

    private ReportListCollection collection;

    public ReportListModel () {
        this.collection= new ReportListCollection();
    }

    public ReportListModel (ReportListCollection collection) {
        this.collection= collection;
    }

    public Object getElementAt (int index) {

        return this.collection.getCollection().get(index);
    }

    public void insertElementAt (Object elem, int index) {

        this.collection.addMessage((ReportListElement)elem);
    }

    public void addElement (Object elem) {

        this.collection.addMessage((ReportListElement)elem);
    }

    public void add (int index, Object elem) {
        
        this.collection.addMessage((ReportListElement)elem);
    }

    public int getSize() {

        return collection.getNumMessages();
    }

    public void addListDataListener(ListDataListener l) {}

    public void removeListDataListener(ListDataListener l) {}

}


ReportListRenderer.java
Код

package UIForms.ReportList;

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

public class ReportListRenderer extends DefaultListCellRenderer {

    public ReportListRenderer() {}

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

        System.out.println("!!!"); //todo: del

        if (value instanceof ReportListElement) {
            ReportListElement listElement= (ReportListElement) value;

            String message= listElement.getReportMessage();
            ImageIcon icon= listElement.getReportIcon();

            JLabel label = (JLabel) super.getListCellRendererComponent(list, message, index, isSelected, hasFocus);
            label.setIcon(icon);

            return label;
        }

        return super.getListCellRendererComponent(list, value, index, isSelected, hasFocus);
    }

}


Юзаю так:
Код

...

JList reportList;

reportList.setModel(new ReportListModel());
reportList.setCellRenderer(new ReportListRenderer());

...

ReportListModel listModel= (ReportListModel)reportList.getModel();
int index = listModel.getSize();
listModel.add(index, new ReportListElement(message, messageType));


И это не работает  smile 
PM MAIL   Вверх
powerOn
Дата 18.12.2006, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(MOFA @  18.12.2006,  00:40 Найти цитируемый пост)
И это не работает  smile  

так, код ваш запустил. у меня все работает  smile , но я заменил в классе ReportListElement (потому что лень искать картинку)
Код

public void setReportIcon(String messType) {
       // this.reportIcon = new myImageIcon().getImageIcon("resources/images/icons/" + messType + ".icon.gif");
        this.reportIcon = new ImageIcon() {

            public void paintIcon(Component c, Graphics g, int x, int y) {
                g.setColor(Color.BLUE);
                g.drawOval(0,0,15,15);
            }

            public int getIconWidth() {
                return 15;
            }

            public int getIconHeight() {
                return 15;
            }
        };
    }


В коде окна, использовал:
Код

        jList1.setCellRenderer(new ReportListRenderer());
        ReportListModel model = new ReportListModel();
        model.addElement(new ReportListElement("message", "type"));
        model.addElement(new ReportListElement("message", "type"));
        model.addElement(new ReportListElement("message", "type"));
        jList1.setModel(model);



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

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


Шустрый
*


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

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



ОК, так у меня тоже заработало, но мне нужно добавлять элементы по событию, тоесть я изнпчально не знаю всю модель.
Как это реализовать?

Сейчас я написал так:
Код

public class TraningForm extends myForms {

    ...

    private JList reportList;
    private ReportListModel listModel= new ReportListModel();

    ...

     public void reportInsertMessage (String message, String messageType) {

        listModel.addElement(new ReportListElement(message, messageType));
        reportList.setModel(listModel);
    }

     ....
}


При  этом выводиться в список только первое сообщение, а потом все пропадает и ничего не выводиться.

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


Шустрый
*


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

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



Нашел решение:

Код

...

reportList.setModel(new DefaultListModel());
listModel.addElement(new ReportListElement(message, messageType));
reportList.setModel(listModel);

...


Огромное спасибо за помощь powerOn!!!



PM MAIL   Вверх
Hidrag
Дата 25.4.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(powerOn @  30.3.2006,  18:01 Найти цитируемый пост)
Создаем свой ListCellRedender. отвечающий за прорисовку элементов списка.

А как сделать если нужна не одна а две или более иконок в одной строчке с текстом?


Решение найдено smile кому понадобится спрашивайте ;)

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


--------------------
user posted image
PM 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.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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