java - isCellEditable 和数据库不能一起工作

标签 java swing jtable

更改单元格值后,我的 JTable 不刷新。我可以双击单元格并更改其值,但是当我按“确定”或单击单元格外时,该值将重置为前一个值,但不会更新表格。这是我的自定义表模型的代码,我不知道如何更新数据库,因为当我更改单元格的值时,该表是从数据库中获取的。

package adisys.server.strumenti;

import java.sql.*;
import java.util.Formatter;

import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

import adisys.server.boundary.EditorPatologie;
import adisys.server.data.Database;
import adisys.server.data.Patologie;
import adisys.server.entity.Patologia;


/**
 * @author Francesco
 *
 */
public class ADISysTableModel extends AbstractTableModel implements TableModel {


    ResultSet dati;

    public ADISysTableModel(ResultSet nuoviDati)
    {
        dati=nuoviDati;

        try {
            //Trace
            System.out.println("- Creazione modello tabella: \""+ dati.getMetaData().getTableName(1) +"\"");
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

    }

    @Override
    public int getColumnCount() {

        try {
            return dati.getMetaData().getColumnCount();
        } 
        catch (SQLException e) {
            e.printStackTrace();
            System.out.println("ERRORE: Calcolo del numero di colonne errato.");
            return 0;
        }
    }

    @Override
    public int getRowCount() {

        try {
            //Seleziona l'ultimo elemento
            dati.last();
            //Restituisce l'indice dell'elemento
            return (dati.getRow());


        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("ERRORE: Calcolo del numero di righe errato. (metodo getRowCount() )");
            return 0;
        }
    }

    @Override
    public Object getValueAt(int riga, int colonna) {

        try {
            //Sposta il cursore alla riga desiderata (con sfasamento di 1)
            dati.absolute(riga+1);

            //Estrae il valore nella colonna specificata e lo restituisce (con sfasamento di 1)
            return dati.getObject(colonna+1);

        } catch (SQLException e) {
            // In caso di errore restituisce un oggetto vuoto
            e.printStackTrace();

            //Trace
            System.out.println("ERRORE: Valore dell'elemento della tabella non valido.");
            return null;
        }
    }

    @Override
    public boolean isCellEditable(int rIndex, int cIndex)
    {
        return true;
    }


    @Override
    public String getColumnName(int col) {
        try {
            return dati.getMetaData().getColumnName(col+1);
        } catch (SQLException e) {
            // Eccezione
            e.printStackTrace();
            return "?";
        }
    }

    public Integer getID(int riga)
    {
        //Ricerca colonna ID
        for(int i=0; i<=getColumnCount(); i++)
            if(getColumnName(i).equals("ID"))
                return i;
        return null;
    }


    /**
     * Restituisce l'indice della colonna a partire dal nome della colonna ricercata
     * <b>N.B. L'indice della prima colonna è 0, l'ultimo è numeroColonne-1.</b>
     * @param Nome - Stringa con il nome della colonna
     * @return -1 se la colonna non e' stata trovata, altrimenti l'indice della colonna
     */
    public int getColumnIndex(String Nome)
    {
        for (int i=0; i<getColumnCount();i++)
            if( getColumnName(i)==Nome) return i;
        return -1;
    }


}

如果您需要其他东西,例如数据库或表编辑器的代码,请告诉我;)感谢您的帮助:)

--编辑-- 好吧,我已经实现了 setValueAt 方法,但是当我单击单元格时,它给了我这样的错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at adisys.server.strumenti.ADISysTableModel.setValueAt(ADISysTableModel.java:149)
    at javax.swing.JTable.setValueAt(Unknown Source)
    at javax.swing.JTable.editingStopped(Unknown Source)
    at javax.swing.AbstractCellEditor.fireEditingStopped(Unknown Source)
    at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(Unknown Source)
    at javax.swing.DefaultCellEditor.stopCellEditing(Unknown Source)
    at javax.swing.JTable$GenericEditor.stopCellEditing(Unknown Source)
    at javax.swing.DefaultCellEditor$EditorDelegate.actionPerformed(Unknown Source)
    at javax.swing.JTextField.fireActionPerformed(Unknown Source)
    at javax.swing.JTextField.postActionEvent(Unknown Source)
    at javax.swing.JTextField$NotifyAction.actionPerformed(Unknown Source)
    at javax.swing.SwingUtilities.notifyAction(Unknown Source)
    at javax.swing.JComponent.processKeyBinding(Unknown Source)
    at javax.swing.JComponent.processKeyBindings(Unknown Source)
    at javax.swing.JComponent.processKeyEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

我的 setValueAt 方法是这样的:

Vector<Paziente> content;

    @Override
    public void setValueAt(Object value, int rowIndex, int columnIndex)
    {
        Paziente row = this.content.elementAt(rowIndex);
        String strValue = (String)value;
        int IDValue = (int)value;
        if(columnIndex == 0)
        {
            row.setID(IDValue);
        }
        else if(columnIndex == 1)
        {
            row.setNome(strValue);
        }
        else if(columnIndex == 2)
        {
            row.setCognome(strValue);
        }
        fireTableCellUpdated(rowIndex, columnIndex);
    }

请您再次帮我解决这个问题吗? :) 我对这个功能感到非常着迷,我知道对于很多人来说这并不困难,但对我来说却是......感谢您的回答,祝您有美好的一天! :D

更新:我已经用这段代码解决了这个问题: [代码] @覆盖 公共(public)无效setValueAt(对象值,int rowIndex,int columnIndex) {字符串aValue =(字符串)值; 字符串格式 = “更新 PAZIENTI SET NOME =” + “'” + aValue + “'” + “WHERE ID =” + rowIndex + “;”; Database.esegui(formatoIstruzione.toUpperCase()); Pianificatore.agiornaTabelle(); } } [/代码]

换句话说,我启动 sql 指令来更新表,然后刷新它的 View ,以便它几乎显示新值。谢谢大家的帮助和给我的灵感,我们终于成功了! *_*

最佳答案

我在您的 TableModel 中没有看到 setValueAt() 的任何实现。如果没有它,你怎么能期望这些事情发生呢?尝试实现该方法,看看是否做得更好。

更新:

ADISysTableModel 中的第 149 行有一个空引用:

at adisys.server.strumenti.ADISysTableModel.setValueAt(ADISysTableModel.java:149)

打开文本编辑器,转到该行号,然后检查对象引用。在调试器中运行以查看哪一个为空。修复起来很容易。

看到这一行了吗?

Vector<Paziente> content;

这会将引用设置为 null,因为您没有调用 new 将其设置为新引用。

将其更改为这样,NPE 就会消失:

Vector<Paziente> content = new Vector<Paziente>();

这可能不是您想要的,但它不会为空。

我认为你应该处理底层表模型,而不是这个随机 vector 。你知道你的代码,但我认为这也不会让你高兴。

我强烈建议您在尝试真正的问题之前简化事情并阅读 JTable 教程:

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

关于java - isCellEditable 和数据库不能一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18310580/

相关文章:

java - 如何在 LinearLayout 中并排设置 4 个编辑文本?

java - 从 Maven 项目生成分发

java - Eclipselink 进入错误的数据库平台

java - 我应该如何使用 jTable 来表示对象列表?

java - 同时比较二维数组的层

java - JPanel 在设置为图标数组时不显示标签,但在设置为单个图标时会显示

java - 如何将 jlabel 文本在 jpanel 内向左对齐

java - 计时器无法正确触发

java - 如何从 JTable 中删除一行?

java - 在 JTable 中将数字格式化为货币?