一旦我在一个单元格中选择一个项目,为什么在JTable列中的所有JComboBox都具有相同的选定项目?

时间:2016-05-02 21:14:28

标签: java swing

不确定是否有人可以帮助我。我试图在我的程序中创建一个JTable,在指定列的每个单元格中都有JComboBox。

为了实现这一点,我扩展了DefaultTableCellRender和AbstractCellEditor。到目前为止一切正常。当我点击其中一个应该包含JComboBox的单元格时,我已经显示了一个JComboBox。但问题如下:

一旦我在组合框中选择了一个项目并选择了我的表格的另一行,我在一个组合框中选择的项目将在整个列的每个组合框中被选中,因此我的每个单元格中都会显示相同的值。组合框列。

我根据以下教程编写了单元格渲染器和单元格编辑器: http://www.codejava.net/java-se/swing/how-to-create-jcombobox-cell-editor-for-jtable

这是我的桌子型号:

public class FeuhermanMitgliederReportTableModel extends AbstractTableModel {
/**
 * 
 */
private static final long serialVersionUID = 1L;
private FeuhermanTabIdentifications identification;
private Object[][] extendedMitgliederList = null;

protected FeuhermanController controller = null;

/**
 * 
 */
public FeuhermanMitgliederReportTableModel(FeuhermanTabIdentifications _identification) {
    // TODO Auto-generated constructor stub
    identification = _identification;
    controller = new FeuhermanController();
    ArrayList<Mitglieder> mitgliederList = controller.getMitglieder();

    switch (identification) {
        case UEBUNG:
            extendedMitgliederList = new Object[mitgliederList.size()][4];

            for (Mitglieder m : mitgliederList) {
                int mIndex = mitgliederList.indexOf(m);
                extendedMitgliederList[mIndex][0] = new Boolean(false);
                extendedMitgliederList[mIndex][1] = m;
                extendedMitgliederList[mIndex][2] = new Boolean(false);
                extendedMitgliederList[mIndex][3] = null;
            }
            break;
        case TAETIGKEIT:
            extendedMitgliederList = new Object[mitgliederList.size()][2];

            for (Mitglieder m : mitgliederList) {
                int mIndex = mitgliederList.indexOf(m);
                extendedMitgliederList[mIndex][0] = new Boolean(false);
                extendedMitgliederList[mIndex][1] = m;
            }
            break;
        default:
            extendedMitgliederList = null;
            break;
    }
}

/* (non-Javadoc)
 * @see javax.swing.table.TableModel#getRowCount()
 */
@Override
public int getRowCount() {
    // TODO Auto-generated method stub
    return extendedMitgliederList.length;
}

/* (non-Javadoc)
 * @see javax.swing.table.TableModel#getColumnCount()
 */
@Override
public int getColumnCount() {
    // TODO Auto-generated method stub
    int retVal = 0;

    switch (identification) {
        case UEBUNG:
            retVal = 5;
            break;
        case TAETIGKEIT:
            retVal = 3;
            break;
        default:
            retVal = 0;
            break;
    }

    return retVal;
}

@Override
public String getColumnName(int column) {
    // TODO Auto-generated method stub
    String[] columnNames = null;

    switch (identification) {
        case UEBUNG:
            columnNames = new String[] {"Eingesetzt","Passnummer", "Name","ATS","KF"};
            break;
        case TAETIGKEIT:
            columnNames = new String[] {"Eingesetzt","Passnummer", "Name"};
            break;
        default:
            columnNames = null;
            break;
    }

    return columnNames[column];
}

@Override
public Class<?> getColumnClass(int columnIndex) {
    // TODO Auto-generated method stub
    Class<?> retVal = null;

    switch (columnIndex) {
    case 0:
        retVal = Boolean.class;
        break;
    case 1:
        retVal = Integer.class;
        break;
    case 2:
        retVal = String.class;
        break;
    case 3:
        retVal = Boolean.class;
        break;
    case 4:
        retVal = FahrzeugeGeraete.class;
        break;

    default:
        retVal = this.getValueAt(0, columnIndex).getClass();
        break;
    }

    return retVal;
}

/* (non-Javadoc)
 * @see javax.swing.table.AbstractTableModel#setValueAt(java.lang.Object, int, int)
 */
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub
    if (columnIndex == 0) {
        extendedMitgliederList[rowIndex][0] = (Boolean) aValue;
    } else if (columnIndex == 3) {
        extendedMitgliederList[rowIndex][2] = (Boolean) aValue;
        if (!(Boolean)this.getValueAt(rowIndex, 0) && (Boolean) aValue) {
            this.setValueAt(aValue, rowIndex, 0);
            this.fireTableDataChanged();
        }
    } else if (columnIndex == 4) {
        extendedMitgliederList[rowIndex][3] = (FahrzeugeGeraete) aValue;
    }

    super.setValueAt(aValue, rowIndex, columnIndex);
}

/* (non-Javadoc)
 * @see javax.swing.table.TableModel#getValueAt(int, int)
 */
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub
    Object[] extendedM = extendedMitgliederList[rowIndex];
    Object[] values = null;

    switch (identification) {
        case UEBUNG:
            values = new Object[] {(Boolean)extendedM[0], ((Mitglieder)extendedM[1]).getMPassnr(), ((Mitglieder)extendedM[1]).getMName() + " " + ((Mitglieder)extendedM[1]).getMVorname(), (Boolean)extendedM[2], extendedM[3]};
            break;
        case TAETIGKEIT:
            values = new Object[] {(Boolean)extendedM[0], ((Mitglieder)extendedM[1]).getMPassnr(), ((Mitglieder)extendedM[1]).getMName() + " " + ((Mitglieder)extendedM[1]).getMVorname()};
            break;
        default:
            values = null;
            break;
    }

    return values[columnIndex];
}

public Object[] getRowAt(int rowIndex) {
    return extendedMitgliederList[rowIndex];
}

/* (non-Javadoc)
 * @see javax.swing.table.AbstractTableModel#isCellEditable(int, int)
 */
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub
    return (columnIndex == 0  || columnIndex == 3 || columnIndex == 4)?true:super.isCellEditable(rowIndex, columnIndex);
}

/* (non-Javadoc)
 * @see javax.swing.table.AbstractTableModel#fireTableDataChanged()
 */
@Override
public void fireTableDataChanged() {
    // TODO Auto-generated method stub
    super.fireTableDataChanged();
}

/*public Object[] getRowByPassNr(int passNr) {
    Object[] retVal = null;

    for (Object[] m : extendedMitgliederList) {
        if (((Mitglieder)m[1]).getMPassnr() == passNr)
            retVal = m;
    }

    return retVal;
}*/

public void setCheckBoxByPassNr(int passNr) {
    for (Object[] m : extendedMitgliederList) {
        if (((Mitglieder)m[1]).getMPassnr() == passNr)
            m[0] = true;
    }

    this.fireTableDataChanged();
}
}

我的细胞渲染器:

public class FeuhermanKFCellRenderer extends DefaultTableCellRenderer {

public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
    if (value instanceof FahrzeugeGeraete) {
        this.setText(((FahrzeugeGeraete)value).getFzgBezeichnung());
    }

    if (isSelected) {
        setBackground(table.getSelectionBackground());
    } else {
        setBackground(table.getSelectionForeground());
    }

    return this;
}
}

我的手机编辑:

public class FeuhermanKFCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {

private FahrzeugeGeraete fzg = null;
private ArrayList<FahrzeugeGeraete> content = null;

protected FeuhermanController controller = null;

public FeuhermanKFCellEditor() {
    // TODO Auto-generated constructor stub
    this.controller = new FeuhermanController();
    this.content = this.controller.getFahrzeugeGeraete(2);
}

@Override
public Object getCellEditorValue() {
    // TODO Auto-generated method stub
    return this.fzg;
}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    JComboBox<FahrzeugeGeraete> cbKF = (JComboBox<FahrzeugeGeraete>) e.getSource();
    this.fzg = (FahrzeugeGeraete) cbKF.getSelectedItem();
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    // TODO Auto-generated method stub
    if (value instanceof FahrzeugeGeraete) {
        this.fzg = (FahrzeugeGeraete) value;
    }

    JComboBox<FahrzeugeGeraete> cbKF = new JComboBox<FahrzeugeGeraete>();

    for (FahrzeugeGeraete tempFzg : content) {
        cbKF.addItem(tempFzg);
    }

    cbKF.setSelectedItem(fzg);
    cbKF.addActionListener(this);

    if (isSelected) {
        cbKF.setBackground(table.getSelectionBackground());
    } else {
        cbKF.setBackground(table.getSelectionForeground());
    }

    return cbKF;
}
}

创建表格的地方:

tabMitglieder = new JTable(new FeuhermanMitgliederReportTableModel(FeuhermanTabIdentifications.UEBUNG)) {
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
        {
            Component c = super.prepareRenderer(renderer, row, column);

            if (!isRowSelected(row) && !(Boolean)tabMitglieder.getValueAt(row, 0)) {
                //c.setBackground(row % 2 == 0 ? new Color(200,0,0) : Color.RED);
                c.setBackground(new Color(200,0,0));
                c.setForeground(Color.WHITE);
            }

            if(!isRowSelected(row) && (Boolean)tabMitglieder.getValueAt(row, 0)) {
                //c.setBackground(row % 2 == 0 ? new Color(0,200,0) : Color.GREEN);
                c.setBackground(new Color(0,200,0));
                c.setForeground(new Color(0,80,0));
            }

            return c;
        }
    };
    tabMitglieder.setDefaultRenderer(FahrzeugeGeraete.class, new FeuhermanKFCellRenderer());
    tabMitglieder.setDefaultEditor(FahrzeugeGeraete.class, new FeuhermanKFCellEditor());
    tabMitglieder.setFillsViewportHeight(true);
    tabMitglieder.setFont(new Font("SansSerif", tabMitglieder.getFont().getStyle(), 18));
    tabMitglieder.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    tabMitglieder.setRowHeight(tabMitglieder.getFont().getSize() + 5);

我已经花了几个小时搜索互联网,但不幸的是我无法找到解决问题的方法。

如果有人能帮我把这件事搞定,我将不胜感激。

非常感谢提前!

干杯, 岸堤

0 个答案:

没有答案