【问题标题】:JTable calculate sum of the last columnJTable计算最后一列的总和
【发布时间】:2015-01-05 18:13:06
【问题描述】:

我有一个 JTable 女巫实现了 TableModelListener,我已经实现了 tableChanged(TableModelEvent event) 方法,但我无法检测到被修改的正确列。我得到 col -1,而我正在编辑第二列或特定列。

这是我对 tableChanged(TableModelEvent event) 方法的实现:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;


public class JTableTest extends JDialog{
    private JTable myTable ; 

    public JTableTest() {
        super();

        myTable = new JTable(new myTableModel());
        getContentPane().add(new JScrollPane(myTable),BorderLayout.CENTER);
        pack();
    }

    class myTableModel extends AbstractTableModel implements TableModelListener{

        Object[][] donnees = {
                {"Johnathan", "Sykes","Natation"},
                {"Nicolas", "Van de Kampf","FOOTBALL" },
                {"Damien", "Cuthbert","TENNIS" },
                {"Corinne", "Valance","NATATION"},
                {"Emilie", "Schrödinger","FOOTBALL"},
                {"Delphine", "Duke","TENNIS"},
                {"Eric", "Trump","TENNIS"},
        };

        String[] entetes = {"Prénom", "Nom","SPORT"};

        public myTableModel() {
            addTableModelListener(this);
        }

         public int getRowCount() {
        return donnees.length;

    }

    public int getColumnCount() {
        return entetes.length;
    }

    public String getColumnName(int columnIndex) {
        return entetes[columnIndex];
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return donnees[rowIndex][columnIndex];
    }

        @Override
        public void tableChanged(TableModelEvent me) {
            // I wanna get the right column not -1
            System.out.println(me.getColumn());
            switch(me.getType()){
                case TableModelEvent.UPDATE:
                    System.out.println("Updating...");break;
                case TableModelEvent.INSERT:
                    System.out.println("Inserting...");break; 
                case TableModelEvent.DELETE:
                    System.out.println("Delete...");break;
                default :break ;
            }

         }

        @Override
        public void setValueAt(Object value, int row, int col) {
            donnees[row][col] = (String) value;
            fireTableDataChanged();
         }


        @Override
        public boolean isCellEditable(int row, int col) {
            return true; 
         }



}

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new JTableTest().setVisible(true);
            }
        });
    }








}

【问题讨论】:

  • 它返回常量 TableModelEvent.ALL_COLUMNS。您是否检查了 event.getType() 以确保您获得更新?如果不是,则将您的代码包装在 if 或 switch 中。
  • 我添加了 event.getType(),我得到了更新,但 event.getColumn() 仍然返回 -1,而我正在更改活动列(1 或 2)
  • 你能添加你的表创建代码吗?我通常使用 AbstractTableModel 的子类创建 JTable,它允许您覆盖 setValue。我发现这比响应事件更容易。
  • 不会解决你的问题,但不要手动调用“firstTableDataChanged()”。 TableModel 负责在数据更改时调用该方法。我从来没有遇到过 TableModelListener 的问题。发布您的SSCCE 来证明问题。请记住,当第 3 列中的数据更新时,SSCCE 应该只显示一条消息。我们不关心您的实际处理。
  • 我写了一个sscce例子

标签: java swing event-handling jtable


【解决方案1】:

根据您最初的问题,我们应该如何猜测您正在使用自定义 TableModel?这就是为什么您应该始终在问题中包含正确的 SSCCE,这样我们就不必猜测您可能会或可能不会做什么。

为什么要使用自定义 TableModel?无需创建自定义模型。 DefaultTableModel 将执行您的自定义模型所做的事情。

无论如何,问题确实出在您的自定义 TableModel 上:

//fireTableDataChanged();
fireTableCellUpdated(row, col);

您没有更改所有数据。您只更改了一个单元格的数据,因此触发正确的事件。

【讨论】:

  • 不,这只是我真实问题的模拟。我已经自定义了表格模型以使单元格可编辑,允许用户添加行女巫不是字符串类型的对象......等等。
  • @abdouamer,这一切都可以通过 DefaultTableModel 完成。你重写了 isCellEditable(...) 方法,你没有创建一个全新的类。
  • 你的意思是我需要扩展 DefaultTableModel ?
【解决方案2】:

BigDecimal.add(BigDecimal) 方法返回 BigDecimal。它不会重新分配值。

您应该使用以下代码重新分配somme 值:

somme = somme.add((BigDecimal) getValueAt(i, 3));

【讨论】:

  • 好的,我解决了这个问题,但这不是那个帖子的问题,我想检测第三列的值何时更新
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
相关资源
最近更新 更多