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

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

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

Листинг программы
  1. package limitedspinnertable;
  2. import java.awt.Color;
  3. import java.awt.Component;
  4. import java.awt.Container;
  5. import java.awt.Dimension;
  6. import java.util.ArrayList;
  7. import java.util.EventObject;
  8. import javax.swing.AbstractCellEditor;
  9. import javax.swing.JFormattedTextField;
  10. import javax.swing.JFrame;
  11. import javax.swing.JSpinner;
  12. import javax.swing.JTable;
  13. import javax.swing.SpinnerNumberModel;
  14. import javax.swing.border.Border;
  15. import javax.swing.border.LineBorder;
  16. import javax.swing.table.AbstractTableModel;
  17. import javax.swing.table.TableCellEditor;
  18. import javax.swing.table.TableCellRenderer;
  19. import javax.swing.table.TableModel;
  20. import javax.swing.text.NumberFormatter;
  21. public class LimitedSpinnerTable
  22. {
  23. public static void main(String[] args)
  24. {
  25. MyFrame frame=new MyFrame();
  26. frame.setVisible(true);
  27. }
  28. }
  29. class MyFrame extends JFrame
  30. {
  31. public MyFrame()
  32. {
  33. setSize(400, 100);
  34. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  35. TableModel model=new AddCubicleTableModel(); //создаем нашу модель таблицы
  36. JTable table=new JTable(model);
  37. table.setPreferredScrollableViewportSize(new Dimension(400, 100));
  38. table.setDefaultRenderer(LimitedSpinner.class, new SpinnerRenderer());
  39. table.setDefaultEditor(LimitedSpinner.class, new SpinnerEditor());
  40. Container pane=getContentPane();
  41. pane.add(table);
  42. }
  43. }
  44.  
  45. class LimitedSpinner extends JSpinner
  46. {
  47. public LimitedSpinner(SpinnerNumberModel model)
  48. {
  49. super(model);
  50. setEditor(new JSpinner.NumberEditor(this, "00"));
  51. JFormattedTextField txt = ((JSpinner.NumberEditor)this.getEditor()).getTextField();
  52. ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false);
  53. }
  54. }
  55.  
  56. class AddCubicleTableModel extends AbstractTableModel
  57. {
  58. public static final int NAME_COLUMN=0;
  59. public static final int NUMBER_COLUMN=1;
  60. public static final int SECTION_COLUMN=2;
  61. String[] columnNames={"Имя","Номер","Секция"};
  62. ArrayList data=new ArrayList();
  63.  
  64. public AddCubicleTableModel()
  65. {
  66. data.add("Без имени");
  67. data.add(new LimitedSpinner(new SpinnerNumberModel(1,1,100,1)));
  68. data.add(new LimitedSpinner(new SpinnerNumberModel(1,1,100,1)));
  69. }
  70. @Override
  71. public Class getColumnClass(int c)
  72. {
  73. if(c==1||c==2) {return LimitedSpinner.class;} else
  74. {return String.class;}
  75. }
  76. @Override
  77. public int getRowCount()
  78. {
  79. return 1;
  80. }
  81. @Override
  82. public int getColumnCount()
  83. {
  84. return columnNames.length;
  85. }
  86. @Override
  87. public String getColumnName(int c)
  88. {
  89. return columnNames[c];
  90. }
  91. @Override
  92. public Object getValueAt(int r, int c)
  93. {
  94. if(getColumnClass(c)==LimitedSpinner.class)
  95. {
  96. LimitedSpinner sp=(LimitedSpinner)data.get(c);
  97. return sp.getValue();
  98. }
  99. else return (String)data.get(c);
  100. }
  101. @Override
  102. public void setValueAt(Object value, int r, int c)
  103. {
  104. if(getColumnClass(c)==LimitedSpinner.class)
  105. {
  106. LimitedSpinner sp=(LimitedSpinner)data.get(c);
  107. sp.setValue(value);
  108. //data.set(c, sp);
  109. } else
  110. {
  111. String str=(String)data.get(c);
  112. str=(String) value;
  113. //data.set(c, str);
  114. }
  115. fireTableCellUpdated(r, c);
  116. }
  117. }
  118.  
  119. class SpinnerEditor extends AbstractCellEditor implements TableCellEditor
  120. {
  121. private LimitedSpinner component;
  122. public SpinnerEditor()
  123. {
  124. component=new LimitedSpinner(new SpinnerNumberModel(1,1,100,1));
  125. }
  126. @Override
  127. public Object getCellEditorValue()
  128. {
  129. return (Integer)component.getValue();
  130. }
  131. @Override
  132. public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
  133. {
  134. if(isSelected)
  135. { component.setValue(value);
  136. }
  137. return component;
  138. }
  139. @Override
  140. public boolean isCellEditable(EventObject evt)
  141. {
  142. return true;
  143. }
  144. }
  145. class SpinnerRenderer extends LimitedSpinner implements TableCellRenderer
  146. {
  147. private Border originalBorder;
  148.  
  149. public SpinnerRenderer()
  150. {
  151. super(new SpinnerNumberModel(1, 1, 100,1));
  152. }
  153. @Override
  154. public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
  155. {
  156. if (hasFocus)
  157. {
  158. this.setBorder(new LineBorder(Color.BLUE));
  159. } else
  160. {
  161. this.setBorder(originalBorder);
  162. }
  163. this.setValue((Integer)value);
  164. return this;
  165. }
  166. }

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

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

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут