Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 JTable fireDataChanged复制单元格值_Java_Swing_List_Jtable_Abstracttablemodel - Fatal编程技术网

Java JTable fireDataChanged复制单元格值

Java JTable fireDataChanged复制单元格值,java,swing,list,jtable,abstracttablemodel,Java,Swing,List,Jtable,Abstracttablemodel,我试图寻找答案,但我从未发现有人有这个问题 基本上发生的是,应该显示我的对象的JTable正在将最后一个单元格值的值复制到之前的单元格中 更具体地说,我有一个名为“Artikl”的对象列表。Artikl有4个值,我想在表中显示,字符串naziv、字符串drzava、Int kolicina和Float cijena 假设这些变量的值是naziv=“x”,drzava=“y”,kolicina=2,cijena=100 将值添加到对象Artikl,然后将对象添加到列表中时,一切正常,值与它们应该的

我试图寻找答案,但我从未发现有人有这个问题

基本上发生的是,应该显示我的对象的JTable正在将最后一个单元格值的值复制到之前的单元格中

更具体地说,我有一个名为“Artikl”的对象列表。Artikl有4个值,我想在表中显示,字符串naziv、字符串drzava、Int kolicina和Float cijena

假设这些变量的值是
naziv=“x”
drzava=“y”
kolicina=2
cijena=100

将值添加到对象Artikl,然后将对象添加到列表中时,一切正常,值与它们应该的一样

当我使用
artiklModel.fireDataChanged()时会出现问题
表中显示的值为
naziv=“x”
drzava=“y”
kolicina=100
cijena=100

我已经调试了2天,找不到原因。 我将在下面附上必要的代码(由于这是一个大学项目,我不能再添加更多)

这是我的桌面模型:

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;
}
}
表单有用于添加值的文本框和组合框,当我单击按钮时,这些值应添加到列表中,然后显示在表中:

        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++;
}
下一部分在另一个类中,我使用它更新列表并在表中显示结果:

        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++;
}

有人知道吗?我慢慢疯了。

在您的切换声明中:

case COLUMN_KOLICINA:
    value = artikl.getKolicina();
case COLUMN_CIJENA:
    value = artikl.getCijena();
    break;
有一个
中断缺失,因此对于
case列_KOLICINA
value=artikl.getCijena()
也会执行

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

1.出于原因,有两个数组
Artikl
XxxTableModel
,2。覆盖
AbstractTableModel
中的
getColumnClass
,以便在
JTables视图中正确呈现,3。您的模型尚未完成,您需要使用适当的通知程序fireXxxXxx 4覆盖setValueAt。将适当的通知程序设置为添加/删除Artikl,5。为了获得更好的帮助,请尽快发布一个
SSCCE
/
MCVE
,简短、可运行、可编译,请查看我对OP的评论中的第2点和第4点,否则JTables视图中不会绘制任何内容,也不会correctly@mKorbel是的,也是这样。我以为OP是故意漏掉的。谢谢你,我差点把笔记本电脑扔出窗外。是的,我故意漏掉了一些代码,那些我认为与问题无关的部分。@mercin,不客气。如果这解决了您的问题,请将其标记为已解决(答案左侧的钩子),因此此问题标记为已解决。