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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable и ImageIcon - не удаётся вставить, прописывается строчкой в ячейке.. 
:(
    Опции темы
Proger10
Дата 21.4.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот компилирующийся код и "работающий":
Код
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
 
class RadioButtonRenderer implements TableCellRenderer {

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        System.out.println( "1 RadioButtonRenderer: " + row + "x" + column );

        if (value==null) return null;

        System.out.println( "2 RadioButtonRenderer: " + row + "x" + column );

        return (Component)value;
    }

}

class RadioButtonEditor extends DefaultCellEditor implements ItemListener {

    private JRadioButton button;
    
    public RadioButtonEditor( JCheckBox checkBox ) {
        super(checkBox);
    }
    
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

        System.out.println( "1 RadioButtonEditor: " + row + "x" + column );

        if (value==null) return null;

        System.out.println( "2 RadioButtonEditor: " + row + "x" + column );

        button = (JRadioButton)value;
        button.addItemListener(this);
        return (Component)value;

    }
    
    public Object getCellEditorValue() {
        button.removeItemListener(this);
        return button;
    }
    
    public void itemStateChanged(ItemEvent e) {
        super.fireEditingStopped();
    }

}

public class JRadioButtonTableExample extends JFrame {

    public JRadioButtonTableExample(){

        super( "JRadioButtonTable Example" );

        //UIDefaults ui = UIManager.getLookAndFeel().getDefaults();
        //UIManager.put( "RadioButton.focus", ui.getColor("control") );

        DefaultTableModel dm = new DefaultTableModel();
        dm.setDataVector(
            new Object[][]
                {
                    { "Group 1",new JRadioButton("A"), new ImageIcon( "icon.gif" ) },
                    { "Group 1",new JRadioButton("B"), new ImageIcon( "icon.gif" ) },
                    { "Group 1",new JRadioButton("C"), new ImageIcon( "icon.gif" ) },
                    { "Group 2",new JRadioButton("a"), new ImageIcon( "icon.gif" ) },
                    { "Group 2",new JRadioButton("b"), new ImageIcon( "icon.gif" ) }
                },
            new Object[]{ "String","JRadioButton", "Icon" }
        );
/*
        // работает (без иконок)
        dm.setDataVector(
            new Object[][]{
                {"Group 1",new JRadioButton("A")},
                {"Group 1",new JRadioButton("B")},
                {"Group 1",new JRadioButton("C")},
                {"Group 2",new JRadioButton("a")},
                {"Group 2",new JRadioButton("b")}},
            new Object[]{"String","JRadioButton"}
        );
*/
                        
        JTable table = new JTable( dm ) {
            public void tableChanged(TableModelEvent e) {
                super.tableChanged(e);
                repaint();
            }
        };

        ButtonGroup group1 = new ButtonGroup();
        group1.add((JRadioButton)dm.getValueAt(0,1));
        group1.add((JRadioButton)dm.getValueAt(1,1));
        group1.add((JRadioButton)dm.getValueAt(2,1));

        ButtonGroup group2 = new ButtonGroup();
        group2.add((JRadioButton)dm.getValueAt(3,1));
        group2.add((JRadioButton)dm.getValueAt(4,1));

        table.getColumn("JRadioButton").setCellRenderer(new RadioButtonRenderer());
        table.getColumn("JRadioButton").setCellEditor(new RadioButtonEditor(new JCheckBox()));
        JScrollPane scroll = new JScrollPane(table);

        getContentPane().add( scroll );
        setSize( 200, 140 );
        setVisible(true);

    }
    
    public static void main(String[] args) {

        JRadioButtonTableExample frame = new JRadioButtonTableExample();

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }
}


Почему у меня не получается вставить объект ImageIcon?
Чего бы изменить такого, чтобы оно работало?
PM MAIL   Вверх
math64
Дата 21.4.2009, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Рендерер должен вернуть JLabel с помещенной на ней иконкой
PM   Вверх
Proger10
Дата 21.4.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это метод тот, который "getTableCellRendererComponent"?

Но тут не ясно вот что.. При запуске мы видим:
Цитата
1 RadioButtonRenderer: 0x1
2 RadioButtonRenderer: 0x1
1 RadioButtonRenderer: 1x1
2 RadioButtonRenderer: 1x1
1 RadioButtonRenderer: 2x1
2 RadioButtonRenderer: 2x1
1 RadioButtonRenderer: 3x1
2 RadioButtonRenderer: 3x1
1 RadioButtonRenderer: 4x1
2 RadioButtonRenderer: 4x1

Походу рендеринг совсем и не пытается даже обработать ячейки 2го ряда..?(только первый ряд) В этом случаем не кроется ли проблема?
PM MAIL   Вверх
math64
Дата 21.4.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1. Для нужной колонки TableModel должна на getColumnClass() должен возвращать ImageIcon
2. В таблице для класса ImageIcon должен быть зарегистрирован рендерер
3. Рендерер должен возвращать JLabel с иконкой. По умолчанию он возвращает себя (он extends JLabel) без иконки и с текстом object.toString()

Примеры полжно найти на сайте Sun table.html
PM   Вверх
Proger10
Дата 21.4.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ок, ща разберёмся.
(кстати, я как раз и начал с той Сановской ссылки изучение JTable, но что-то не очень там подходящие примеры рассматриваются и начал рыскать по гуглу использование JTable)

Ты не подскажешь какой смысл вот в этой строке?
Код
table.getColumn("JRadioButton").setCellEditor(new RadioButtonEditor(new JCheckBox()));

не очень понятно зачем мы передаём сюда экземпляр JCheckBox(), если у нас JRadioButton'ы...

Это сообщение отредактировал(а) Proger10 - 21.4.2009, 16:37
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.3135 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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