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