【问题标题】:JTable fireDataChanged duplicating cell valuesJTable fireDataChanged重复单元格值
【发布时间】:2014-05-13 11:51:32
【问题描述】:

我尝试寻找答案,但从未发现有人遇到此问题。

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

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

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

将值添加到 Artikl 对象,然后将对象添加到 List 时,一切正常,值是应有的。

当我使用artiklModel.fireDataChanged(); 时出现问题 表中显示的值为naziv="x"drzava="y"kolicina=100cijena=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++;
}

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

【问题讨论】:

  • 1.为什么有两个数组 ArtiklXxxTableModel , 2. 覆盖 AbstractTableModel 中的 getColumnClass 以在 JTables view 中正确渲染, 3. 你的模型没有完成,你需要用适当的覆盖 setValueAt通知程序 fireXxxXxx 4. 设置适当的通知程序以添加/删除Artikl,5. 为了获得更好的帮助,请尽快发布SSCCE/MCVE,简短、可运行、可编译

标签: java swing list jtable abstracttablemodel


【解决方案1】:

在你的 switch 语句中:

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

缺少break;,因此对于case COLUMN_KOLICINAvalue = artikl.getCijena() 行也会被执行。

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

【讨论】:

  • 请在我对 OP 的评论中看到我的第 2 点和第 4 点,否则在 JTables 视图中不会绘制任何内容,也不会正确
  • @mKorbel 是的,也是。我认为 OP 故意忽略了这一点。
  • 谢谢你,我差点把笔记本电脑扔出窗外。是的,我故意遗漏了部分代码,我认为这些部分与问题无关。
  • @mercin 不客气。如果这解决了您的问题,请将其标记为这样(答案左侧的钩子),以便将此问题标记为已解决。
猜你喜欢
  • 2016-07-11
  • 2012-09-24
  • 1970-01-01
  • 2012-12-30
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2011-01-25
相关资源
最近更新 更多