Не редактируются ячейки 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д