0

私は出席システムを設計しています。このために、学生をリストし、名前に対して出席をマークするために 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 番目の列として一連のラジオボタンを取得しています。

デフォルトで RadioButton を「4」として選択し、テーブルに行を動的に追加しています。

 jTableDT.getDataVector().removeAllElements();
  while(rs.next())
 {

  jTableDT.insertRow(i,new Object[ {rs.getString(1),rs.getString(2),rs.getString(4),"4"});
            i++;
  }

私の問題:-

ユーザーがクラス/セクションを選択して学生の出席をマークし、学生のリスト (テーブルの 10 行とします) が上記の RadioButtons パネルで動的に生成されるとします。ユーザーが別のクラス/セクションを選択すると、次の例外がスローされます:-

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に適用していることを理解している限り(ユーザーが別のセクション/クラスを選択したとき)。また、選択したクラス/セクションの行が以前に選択したクラス/セクション テーブルよりも少ない場合、上記の例外はスローされません。

各クラス/セクション呼び出しで(テーブルモデルデータをリセットしているため)テーブルセルレンダラーまたはテーブルセルエディターをリセットする方法はありますか?

私を助けてください。

4

1 に答える 1

0

私の見解では、私の問題は、CellEditingタスクを完了しておらず、ユーザーが別のセクション/クラスを選択すると、jtablecelleditorが以前の値を新しいデータに適用するだけで問題が発生することです。だから私は追加しました

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

私が間違っている場合は私を訂正してください...

于 2012-09-02T19:33:52.437 に答える