簡體   English   中英

JTable fireDataChanged重復的單元格值

[英]JTable fireDataChanged duplicating cell values

我試着尋找答案,但我從來沒有發現任何人有這個問題。

基本上發生的事情是,應該顯示我的對象的JTable在此之前將最后一個單元格值的值復制到單元格中。

更具體地說,我有一個名為“Artikl”的對象列表。 Artikl有4個值,我想在表格中顯示,String naziv,String drzava,Int kolicina和Float cijena。

讓我們說這些變量的值是naziv="x"drzava="y"kolicina=2kolicina=2 cijena=100

將值添加到對象Artikl,然后將對象添加到List時,一切正常,值應該是正確的。

當我使用artiklModel.fireDataChanged();時出現問題artiklModel.fireDataChanged(); 表中顯示的值是naziv="x"drzava="y"kolicina=100kolicina=100 cijena=100

我已經調試了2天,但找不到原因。 我將在下面附上必要的代碼(由於這是一個大學項目,我不能添加更多)。

public class Artikl {

private int rbr;
private float cijena;
private String naziv;
private String drzava;
int kolicina;

public int getRbr(){
    return rbr;
}

public void setRbr(int rbr){
    this.rbr = rbr;
}

public int getKolicina(){
    return kolicina;
}

public void setKolicina(int kolicina){
    this.kolicina = kolicina;
}

public float getCijena(){
    return cijena;
}

public void setCijena(float cijena){
    this.cijena = cijena;
}

public String getNaziv(){
    return naziv;
}

public void setNaziv(String naziv){
    this.naziv = naziv;
}

public String getDrzava(){
    return drzava;
}

public void setDrzava(String drzava){
    this.drzava = drzava;
}
}

這是我的TableModel:

public class ArtiklModel extends AbstractTableModel{
private static final int COLUMN_NAZIV         = 0;
private static final int COLUMN_DRZAVA        = 1;
private static final int COLUMN_KOLICINA      = 2;
private static final int COLUMN_CIJENA        = 3;

private List<Artikl> listArtikl;
private String[] columnNames;

public ArtiklModel() {
    // initializes contact list
    this.listArtikl = new ArrayList<Artikl>();
    // define column names
    columnNames = new String[] {"Naziv",
    "Država","Količina", "Cijena"};
}

@Override
public int getColumnCount() {
    return columnNames.length;
}

public String getColumnName(int column) {
       return columnNames[column];
}   

@Override
public int getRowCount() {
    return listArtikl.size();
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Object value = null;
    Artikl artikl = listArtikl.get(rowIndex);

    switch (columnIndex) {
    case COLUMN_NAZIV:
        value = artikl.getNaziv();
        break;
    case COLUMN_DRZAVA:
        value = artikl.getPorijeklo();
        break;
    case COLUMN_KOLICINA:
        value = artikl.getKolicina();
    case COLUMN_CIJENA:
        value = artikl.getCijena();
        break;
    }

return value;
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
}   

public void addArtikl(Artikl novi) {
    this.listArtikl.add(novi);
}

public void removeArtikl(int rowIndex) {
    this.listArtikl.remove(rowIndex);
}

public List<Artikl> getArtikli(){
    return listArtikl;
}
}

這是主表單的一部分,我在其中創建表並將其放入我的表單中:

        final JTable tablicaArtikla = new JTable();
    final ArtiklModel model1 = new ArtiklModel();
    tablicaArtikla.setModel(model1);

    final JScrollPane pane = new JScrollPane(tablicaArtikla);

    GridBagConstraints gbc_table_1 = new GridBagConstraints();
    gbc_table_1.gridheight = 8;
    gbc_table_1.insets = new Insets(0, 0, 5, 0);
    gbc_table_1.fill = GridBagConstraints.BOTH;
    gbc_table_1.gridx = 5;
    gbc_table_1.gridy = 1;

    StavkeRacunaTab.add(pane, gbc_table_1);

表單有TextBoxes和Comboboxes用於添加值,當我單擊一個按鈕時,這些值應該添加到List中,然后顯示在表中:

        btnDodajArtikl.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent arg0) {

                inHelper.DodajUTablicu(txtKolicina.getText(), txtNaziv.getText(), txtPojedinacnaCijena.getText(), cboDrzava.getSelectedItem().toString(), model1);
                txtKolicina.setText("");
                txtNaziv.setText("");
                txtPojedinacnaCijena.setText("");

                model1.fireDataChanged();              
            }


        }
    });

下一部分是在另一個類中,我用它來更新我的列表並在表中顯示結果:

    public void DodajUTablicu(String kolicina, String naziv, String cijena, String drzava, ArtiklModel artiklModel){

    Artikl artikl = new Artikl();
    artikl.setKolicina(Integer.parseInt(kolicina));
    artikl.setCijena(Float.parseFloat(cijena));
    artikl.setDrzava(drzava);
    artikl.setRbr(rbr);
    artikl.setNaziv(naziv);

    artiklModel.addArtikl(artikl);

    rbr++;
}

有人有什么主意嗎? 我慢慢發瘋了。

在你的switch語句中:

case COLUMN_KOLICINA:
    value = artikl.getKolicina();
case COLUMN_CIJENA:
    value = artikl.getCijena();
    break;

break; 缺少,所以對於case COLUMN_KOLICINA ,行value = artikl.getCijena()被執行。

case COLUMN_KOLICINA:
    value = artikl.getKolicina();
    break; // THIS LINE MISSING
case COLUMN_CIJENA:
    value = artikl.getCijena();
    break;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM