Не редактируются ячейки 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);