Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > JComboBox в JTable


Автор: malah 20.3.2008, 14:53
Доброго дня!
Проблема следующая: есть табличка, в ней элементы строки и JComboBox, сразу после запуска выбираю значение из первого Бокса и.... оно заносится во все остальные (они кстати пересекаются выпадающим списком).... Однако, после выбора во всех Боксах, проблема исчезает....
Вопрос № 1
Почему так происходит?
Вопрос № 2
Как это исправить?
Вопрос № 3
Может ли кто-нибудь детально описать процесс работы Renderer и Editor (включая параметры) на русском языке... Прочитал уже много чего, но ясности что то нет  smile 
Код

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableCellRenderer;
import java.awt.*;

/**
 * Created by IntelliJ IDEA.
 * User: sergey.malahov
 * Date: 18.03.2008
 * Time: 14:37:35
 * To change this template use File | Settings | File Templates.
 */
public class TableFrame extends JFrame {
    final String [] headers =  new String [] {"Column 1", "Column 2"};
    final String [] items = new String [] {"!1","@2","#3"};
    public TableFrame(){
        super("Таблица");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        DefaultTableModel mod = new  DefaultTableModel(headers, 3);
        for (int i = 0; i < mod.getRowCount(); i ++){
            mod.setValueAt("пункт № " + (i + 1) ,i,0);
            mod.setValueAt(new JComboBox(items),i,1);
        }
        JTable table = new JTable(mod);
        TableColumn col = table.getColumnModel().getColumn(1);
        col.setCellEditor(new Editor());
        col.setCellRenderer(new Rend());
        table.setSelectionMode(0);
        getContentPane().add(new JScrollPane(table));
        setSize(200,200);
        setVisible(true);
    }

    public static void main(String [] args){
        try{
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            new TableFrame();
        }
        catch(Exception e){

        }
    }
    public class Rend extends JComboBox implements TableCellRenderer {
        Rend(){
            super(items);
        }

         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
             setSelectedItem(value);
             return this;
        }
    }
    public class Editor extends DefaultCellEditor {
        public Editor() {
            super(new JComboBox(items));
        }
    }
}

Автор: SySaD 21.3.2008, 11:43
Renderer отвечает за статическое отображение ячейки, Editor - за работу с ячейкой (когда редактируешь).
Я писал классы как implements TableCellEditor и  implements TableCellRenderer. Создал класс для хранения инфы, отображаемой в ячейке (список элементов и выбранный элемент). В принципе достаточно все понятно описано в javadoc и 
http://www.exampledepot.com/egs/javax.swing.table/ComboBox.html
http://www.crionics.com/products/opensource/faq/swing_ex/JTableExamples2.html
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#combobox

если нужны детали - пиши в личку - недавно сам разбирался с этим вопросом - помогу чем смогу

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)