当前位置: 首页 > 知识库问答 >
问题:

isCellEditable和数据库不能一起工作

许华清
2023-03-14

更改单元格值后,我的JTable不会刷新。我可以双击一个单元格并更改它的值,但是当我按OK或者我点击离开单元格时,值会重置为上一个,这不是更新表。这是我的自定义表模型的代码,我不知道如何更新数据库,因为当我改变单元格的值时,表是从一个db中取出来的。

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

更新:我已使用以下代码解决了此问题:[CODE]@override public void setValueAt(Object value,int rowIndex,int columnIndex){String aValue=(String)value;String formatoistruzione=“update PAZIENTI SET NOME=”+“”“+aValue+”“”+“WHERE ID=”+rowIndex+“;”;database.eseGUI(formatoistruzione.touppercase());pianificatore.aggiornatabelle();}}[/CODE]

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

共有1个答案

卜飞鸣
2023-03-14

我在您的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>();

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

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

我强烈建议您在尝试真正的问题之前,先简化程序,学习一下JTable教程:

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

 类似资料:
  • 更新:Oook,首先,非常感谢。我不知道用户是postgres中的保留关键字。我把名字改成了CustomUser,但现在问题是另外一个了,应用程序可以工作,但我注意到它创建了一个名为custom_user的相同的CustomUser表,因为它没有使用现有的表? 我刚开始使用Springboot,我不明白我错在哪里。这是我的模型: 希望在您的帮助下,非常感谢大家。

  • {“时间戳”:1553613278534,“状态”:400,“错误”:“错误请求”,“消息”:“必需的字符串参数'param2'不存在”,“路径”:“/MyURL/42”} 我希望PUT的工作就像POST一样,但它似乎不是。 不幸的是,我不能将参数作为QueryParam发送,因此我应该维护相同的请求调用,因为我正在重构一个完全以这种方式工作的现有endpoint。

  • 当异常发生在CompletableFuture中时,我试图设置一个默认值,我通过如下方法使其工作: 但是,当我试图在不好的事情发生时异常地使用complete来停止CompletableFuture,并按如下方式跟踪异常时,我无法像刚才那样捕捉到异常。 更新日期2018-06-09谢谢您的帮助,@Daniele 在join()之前封闭的句柄按预期工作。但在这种情况下,

  • 我正在试验把杰克逊和龙目岛结合起来。这些是我的课: 这些是我添加到类spth中的JAR: > 龙目岛:https://projectlombok.org/downloads/lombok.jar(1.16.10version) 此外,Netbeans项目被配置为“保存时不编译”、“生成调试信息”、“报告不推荐使用的API”、“跟踪java依赖项”、“Activacte注释处理”和“编辑器中的Act

  • 更新后反序列化失败。 我将我的微服务从更新到,并将从更新为,从更新为。 JSON字符串- 班级 - 方法调用- 用于反序列化的方法 - 错误 -

  • 我创建了一个简单的Web API项目,我正试图用邮递员软件发布数据,但有些东西不起作用... 我的web api控制器的名称是ValuesController。 我的数据如下所示: 当我将Post方法修改为: 我收到邮递员的“坏请求”信息