0

JTable でコードを実行すると、非常に厄介な問題が発生しました

「追加」ボタンをクリックしたときにJTableに1行追加する必要があり、列の1つをJComboBoxとしてレンダリングする必要があります

問題は、1行だけ追加すると正常に機能することです。しかし、一度に複数の行を追加すると、どのコンボボックスからアイテムを選択しても、常に最後のコンボボックスのイベントがトリガーされます(MyComboxActionListenerクラスでjComboBoxのハッシュコードを出力したため、常に同じコンボボックスのようです)。

なぜそれが起こるのか、私には理解できません。1行追加すると、まったく新しいコンボボックスと新しいリスナーになるためです。

以下はコードです。

前もって感謝します。

private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {                                    
    ProducedProcedure_new addedProducedProcedure = new ProducedProcedure_new();    // the new item 
    componentProcedureTableModel.getWorks().add(addedProducedProcedure);        //add one line to the table
    componentProcedureTableModel.fireTableRowsInserted(componentProcedureTableModel.getRowCount()-1, componentProcedureTableModel.getRowCount()-1);   

    jTable1.changeSelection(componentProcedureTableModel.getRowCount()-1,0, false, false);

    List<String> procedureNames = produceCardManager.getProcedureNames(componentIdTextField.getText().trim(),false);    //get the items added to combobox
    renderColumnAsCombox(1,procedureNames,addedProducedProcedure);   //-------------------------------------------
}        

 void renderColumnAsCombox(int columnIndex , List<String> items,ProducedProcedure_new producedProcedure) {
    TableColumn col = jTable1.getColumnModel().getColumn(columnIndex);
    JComboBox comboBox = new JComboBox();

    for(String item : items) {
       comboBox.addItem(item);
    }
    MyComboxActionListener myComboxActionListener = new MyComboxActionListener(columnIndex,comboBox,producedProcedure);
    comboBox.addActionListener(myComboxActionListener);
    col.setCellEditor(new DefaultCellEditor(comboBox));
}     

class MyComboxActionListener implements ActionListener {  // listen for the select event of the combobox
    private JComboBox jComboBox;
    private ProducedProcedure_new producedProcedure;
    private int columnIndex;

    public MyComboxActionListener(int columnIndex,JComboBox jComboBox,ProducedProcedure_new producedProcedure) {
        this.columnIndex = columnIndex;
        this.jComboBox = jComboBox;
        this.producedProcedure = producedProcedure;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
          String selectedItem = (String)jComboBox.getSelectedItem();
          producedProcedure.getProcedure().setProcedureName(selectedItem);
          producedProcedure.getProcedure().setProcedureId(String.valueOf(produceCardManager.getProcedureId(selectedItem)));
          producedProcedure.getProcedure().setFactor(produceCardManager.getProcedureFactor(selectedItem));   //automately update the factor
          ((ComponentProcedureTableModel_new)jTable1.getModel()).fireTableDataChanged();
    }
}                              
4

0 に答える 0