Не редактируются ячейки JTable при использовании собственной модели таблицы - Java

Узнай цену своей работы

Формулировка задачи:

package limitedspinnertable;
 
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.EventObject;
import javax.swing.AbstractCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.text.NumberFormatter;
 
public class LimitedSpinnerTable
{
 
    public static void main(String[] args) 
    {
        
        MyFrame frame=new MyFrame();
        frame.setVisible(true);
    }
    
}
 
class MyFrame extends JFrame
{
    public MyFrame()
    {
        setSize(400, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        TableModel model=new AddCubicleTableModel(); //создаем нашу модель  таблицы
        JTable table=new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(400, 100));
        table.setDefaultRenderer(LimitedSpinner.class, new SpinnerRenderer());
        table.setDefaultEditor(LimitedSpinner.class, new SpinnerEditor());
        Container pane=getContentPane();
        pane.add(table);
    }
    
}

class LimitedSpinner extends JSpinner
{
    public LimitedSpinner(SpinnerNumberModel model)
    {
        super(model);
        setEditor(new JSpinner.NumberEditor(this, "00"));
        JFormattedTextField txt = ((JSpinner.NumberEditor)this.getEditor()).getTextField();
        ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false);
    }
 
}

class AddCubicleTableModel extends AbstractTableModel
    {
        public static final int NAME_COLUMN=0;
        public static final int NUMBER_COLUMN=1;
        public static final int SECTION_COLUMN=2;
        
        String[] columnNames={"Имя","Номер","Секция"};
        ArrayList data=new ArrayList();

        public AddCubicleTableModel()
        {
            data.add("Без имени");
            data.add(new LimitedSpinner(new SpinnerNumberModel(1,1,100,1)));
            data.add(new LimitedSpinner(new SpinnerNumberModel(1,1,100,1)));
        }
        
        @Override
        public Class getColumnClass(int c)
        {
            if(c==1||c==2) {return LimitedSpinner.class;} else
            {return String.class;}
        }
 
        @Override
        public int getRowCount() 
        {
            return 1;
        }
 
        @Override
        public int getColumnCount() 
        {
            return columnNames.length;
        }
 
        @Override
        public String getColumnName(int c) 
        {
            return columnNames[c];
        }
 
        @Override
        public Object getValueAt(int r, int c) 
        {
            if(getColumnClass(c)==LimitedSpinner.class)
            {
                LimitedSpinner sp=(LimitedSpinner)data.get(c);
                return sp.getValue();
            }
            else return (String)data.get(c);
          
        }
        
        @Override
        public void setValueAt(Object value, int r, int c)
        {
            if(getColumnClass(c)==LimitedSpinner.class) 
            {
                LimitedSpinner sp=(LimitedSpinner)data.get(c);
                sp.setValue(value);
                //data.set(c, sp);
               
            } else 
            {
                String str=(String)data.get(c);
                str=(String) value;
                //data.set(c, str);
                
            }
            fireTableCellUpdated(r, c);
           
        }
    }

class SpinnerEditor extends AbstractCellEditor implements TableCellEditor
{
    private LimitedSpinner component;
    
    public SpinnerEditor()
    {
        component=new LimitedSpinner(new SpinnerNumberModel(1,1,100,1));
    
    }
        
    @Override
    public Object getCellEditorValue() 
    {
        return (Integer)component.getValue();
    } 
    
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) 
    {
        if(isSelected)
        { component.setValue(value);
        
        }
       return component;
    }
   
    @Override
    public boolean isCellEditable(EventObject evt)       
    {
        return true;          
    }
 
}
 
class SpinnerRenderer extends LimitedSpinner implements TableCellRenderer
{
    private Border originalBorder;

    public SpinnerRenderer()
    {
        super(new SpinnerNumberModel(1, 1, 100,1));
 
    }
 
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        if (hasFocus) 
        {
            this.setBorder(new LineBorder(Color.BLUE));
        } else 
        {
            this.setBorder(originalBorder);
        }
        this.setValue((Integer)value);
        return this;
    }
}

Решение задачи: «Не редактируются ячейки JTable при использовании собственной модели таблицы»

textual
Листинг программы
String str=(String)data.get(c); 
str=(String) value; 
//data.set(c, str);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5