Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将RadioButton组添加到JTable_Java_Swing_Jtable_Tablecelleditor_Jradiobutton - Fatal编程技术网

Java 将RadioButton组添加到JTable

Java 将RadioButton组添加到JTable,java,swing,jtable,tablecelleditor,jradiobutton,Java,Swing,Jtable,Tablecelleditor,Jradiobutton,我正在设计一个考勤系统,为此我使用一个JTable来列出学生名单,并根据他们的姓名标记出勤情况。 我在Jtable列中添加了一个RadioButton组,我的代码如下:- JTable jTable = new JTable(){ public void tableChanged(TableModelEvent e) { super.tableChanged(e); repaint(); } }; jTableDT=new DefaultTableModel( new Obj

我正在设计一个考勤系统,为此我使用一个JTable来列出学生名单,并根据他们的姓名标记出勤情况。 我在Jtable列中添加了一个RadioButton组,我的代码如下:-

JTable jTable = new JTable(){

public void tableChanged(TableModelEvent e) {
    super.tableChanged(e);
    repaint();
}

};
jTableDT=new DefaultTableModel(
new Object [][] {},
new String [] {
    "Enroll","Student Id", "Student Name","Attendance"    });

jTable.setModel(jTableDT);
jTable.getColumn("Attendance").setCellRenderer(new RadioButtonRenderer());
jTable.getColumn("Attendance").setCellEditor(new RadioButtonEditor(new JCheckBox()));


class RadioButtonRenderer implements TableCellRenderer {
public JPanel pnl = new JPanel();
public ButtonGroup group1 = new ButtonGroup();
public JRadioButton btnOne = new JRadioButton("Present");
public JRadioButton btnTwo = new JRadioButton("Absent");
public JRadioButton btnThree = new JRadioButton("on Leave");

public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean     hasFocus, int row, int column) {
       if (value==null) return null;

      group1.add(btnOne );
 group1.add(btnTwo );
 group1.add(btnThree );
 pnl.add(btnOne );
 pnl.add(btnTwo );
 pnl.add(btnThree );

 btnThree .setSelected(false);
 btnOne .setSelected(false);
btnTwo .setSelected(false);
 switch(Integer.parseInt((String)value))
{

 case 3:
    btnThree.setSelected(true);
   break;
case 2:
   btnTwo.setSelected(true);
   break;
 case 1:
   btnOne.setSelected(true);
   break;
 }
 return pnl;
   }
 }

 class RadioButtonEditor extends  DefaultCellEditor implements ItemListener 
 {


 public JPanel pnl = new JPanel();
 public ButtonGroup group1 = new ButtonGroup();
  public JRadioButton btnOne = new JRadioButton("Present");
  public JRadioButton btnTwo = new JRadioButton("Absent");
  public JRadioButton btnThree = new JRadioButton("On Leave");

   public RadioButtonEditor(JCheckBox checkBox) {
     super(checkBox);
   }

   public Component getTableCellEditorComponent(JTable table, Object value,boolean isSelected, int row,    int column) {
       if (value==null) return null;

  group1.add(btnOne );
   group1.add(btnTwo );
  group1.add(btnThree );

  pnl.add(btnOne );
   pnl.add(btnTwo );
  pnl.add(btnThree );

  btnThree .setSelected(false);
  btnTwo .setSelected(false);
 btnOne .setSelected(false);

 switch(Integer.parseInt((String)value)) {
 case 3:
    btnThree.setSelected(true);
    break;
  case 2:
   btnTwo.setSelected(true);
   break;
  case 1:
   btnOne.setSelected(true);
   break;
 }
    return pnl;
   }

   public Object getCellEditorValue() {
     if(btnTwo.isSelected() == true)
 return "2";
   if(btnOne.isSelected() == true)
 return "1";
      if(btnThree.isSelected() == true)
 return "3";
 return "";

   }

  public void itemStateChanged(ItemEvent e) {
           super.fireEditingStopped();                
   }
 }
上面的代码正在运行,我得到了一组单选按钮作为第四列

我正在动态地向表中添加行,默认选中的单选按钮为“4”

我的问题:-

假设用户选择一个班级/部门来标记学生的出勤情况,并使用上面的单选按钮面板动态生成学生列表(假设表中有10行)。 现在,当用户选择另一个只有3行学生的类/节时,将引发以下异常:-

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 1
at java.util.Vector.elementAt(Vector.java:470)
at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:665)
at javax.swing.JTable.setValueAt(JTable.java:2744)
at javax.swing.JTable.editingStopped(JTable.java:4726)
at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:141)
at javax.swing.AbstractCellEditor.stopCellEditing(AbstractCellEditor.java:85)
at javax.swing.JTable.columnMarginChanged(JTable.java:4595).........
据我所知,不管是否删除了所有行并输入了新行,表都会以某种方式保留单选按钮值并将其应用于新的jtable(当用户选择另一个节/类时)。 此外,当所选类/节的行数小于其先前所选类/节表的行数时,不会引发上述异常

是否有任何方法可以在每次类/节调用上重置tablecellrenderer或tablecelleditor(因为我正在重置tablemodel数据)


请帮助我。

在我看来,我的问题是我没有完成单元格编辑任务,当用户选择另一个节/类时,jtable celleditor只是将以前的值应用于新数据,从而导致问题。 所以我补充说

if(jTable.isEditing()){
jTable.getCellEditor().stopCellEditing();
}

如果我错了请纠正我…

如果你不尽快得到帮助,考虑创建并发布一个你把代码浓缩到最小的位,它仍然编译和运行,没有外部依赖关系(比如需要链接到数据库或图像),没有额外的代码,这与你的问题无关。但仍然显示了你的问题。感谢气垫船的指导。。。与此同时,我自己想出了解决办法……)如果有任何可能的副本,仍然可以使用更好的解决方案;看看这个。哇,还有@trashgood的回答!10+@HovercraftFullOfEels:原始版本是由于@mKorbel,但是我将为
枚举
:-)获得积分
if(jTable.isEditing()){
jTable.getCellEditor().stopCellEditing();
}