java - 编辑单元格后编辑/更新 JTable

标签 java database swing sqlite jtable

我这几天一直在寻找答案。

我有一个 JTable,其中填充了来自本地 SQLite-DB 的数据。

现在的目标是,用户选择单元格(1 -最大可用),编辑单元格并在 Jtable 中查看他的输入。此外,我想将此输入保存为 SQL 语句。

现在,当用户进行输入并离开单元格时,我陷入了困境。 我没有让 JTable 显示更改。

我尝试了重绘,我尝试了TableModelListener,但没有成功。 JTable 保持不变。 这或许不是什么大问题。但我在这里需要一点帮助。 如何达到显示更新后的 JTable(包括用户的输入)的目标?

package views;

import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import main.DatenHolen;



public class GUI extends JFrame {


private static final long serialVersionUID = 1L;

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

private JButton btLoad;
public JTable table;
final static String DB_PATH = "C:\\DB.db"; //
private JButton btnDBNeuSpeichern;
private JButton btnDatenbankVergleich;
private JButton btnAusgewhlteDateienLoeschen;
private JButton btnZuLoeschendeDateien;

public GUI() throws HeadlessException {

    createComponents();  //Formular und Bestandteile aufbauen
    createEvents(); //Events und Logiken erstellen

}

private void createComponents() {
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    getContentPane().setLayout(null);

    btLoad = new JButton("Datenbank laden");
    btLoad.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent arg0) {

         loadData();            

        }
    });
    btLoad.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
        }
    });
    btLoad.setBounds(537, 25, 183, 28);

    getContentPane().add(btLoad);

    btnDBNeuSpeichern = new JButton("Laufwerke neu in DB laden");

    btnDBNeuSpeichern.setBounds(537, 65, 183, 28);
    getContentPane().add(btnDBNeuSpeichern);

    btnDatenbankVergleich = new JButton("Datenbank mit bisheriger vergleichen");
    btnDatenbankVergleich.setBounds(537, 105, 273, 28);
    getContentPane().add(btnDatenbankVergleich);

    btnAusgewhlteDateienLoeschen = new JButton("Ausgewählte Dateien löschen");
    btnAusgewhlteDateienLoeschen.setBounds(537, 145, 205, 28);
    getContentPane().add(btnAusgewhlteDateienLoeschen);

    btnZuLoeschendeDateien = new JButton("Zu löschende Dateien selektieren");
    btnZuLoeschendeDateien.setBounds(537, 183, 205, 28);
    getContentPane().add(btnZuLoeschendeDateien);

    setSize(918, 850);

}

private void createEvents() {

    btnDBNeuSpeichern.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent arg0) {

        }
    });

}


private void loadData() {


    DatenHolen DBLaden = new DatenHolen(); // DBQuers-Object


    table = new JTable(DBLaden.run(DB_PATH)); //DB_PATH is the SQLite-DB including path ; Method is returning TableModel and therefore populating the Jtable
    table.getModel().addTableModelListener(new TableModelListener(){

        @Override
        public void tableChanged(TableModelEvent arg0) {

        }

       }); 

} 
}

这是我的 JTableModel 类

package main;


import javax.swing.table.DefaultTableModel;

public class TableModelSpezial extends DefaultTableModel{

private static final long serialVersionUID = 1L;



public boolean isCellEditable( int rowIndex, int columnIndex )
{
  return true; //falls Änderung auf eine Zeile beschränkt wird, zb 1. dann columnIndex==0;
}


public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

    System.out.println(aValue);
    System.out.println(rowIndex);
    System.out.println(columnIndex);

  // fireTableCellUpdated(rowIndex, columnIndex);  

}



}

//TableModel 和 SQL_Build

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;
import javax.swing.table.TableModel;

public class DatenHolen extends Thread{


public TableModelSpezial tableModel= new TableModelSpezial();


public TableModel run(String DB_PATH) {

    try (Connection conn = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);  //put up conn to db
            Statement stmt = conn.createStatement()) {

        ResultSet rs = stmt.executeQuery(" select* from dateien");
        ResultSetMetaData metaData = rs.getMetaData();

        // Names of columns
        Vector<String> columnNames = new Vector<String>();
        int columnCount = metaData.getColumnCount();
        for (int i = 1; i <= columnCount; i++) { //Test 1=2, damit i=1 die Spaltennummerierung darstellt

            columnNames.add(metaData.getColumnName(i));
        }

        // Data of the table
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        while (rs.next()) {

            Vector<Object> vector = new Vector<Object>();
            for (int i = 1; i <= columnCount; i++) {

                vector.add(rs.getObject(i));

            }

            data.add(vector);
            System.out.println(vector);

        }

        tableModel.setDataVector(data, columnNames);

    } catch (Exception e) {
        e.printStackTrace();
    }   

    return tableModel;

}


}

最佳答案

secret 就在表模型中,您尚未完全发布该模型。

尽管如此,该模型仍会执行从后备存储到用户界面的转换,反之亦然。因此,您需要以某种方式实现 getValueAt() 来检索要在给定单元格中显示的正确值。在 setValueAt() 中,您必须更新后备存储,以便下次调用 getValueAt() 将返回新值。此外,您重新激活注释的 fireTableCellUpdated,以便表本身知道必须获取新值。

关于java - 编辑单元格后编辑/更新 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39119159/

相关文章:

java - EditText 自动保存设备旋转后的值

java - 如何在 Intellij 13.1.4 的 Maven 多模块项目中重建/制作 .iml 文件

php - mysql_fetch_array 中的无效 MySQL 参数

java - 在 Java 8 中扩展 List<T>

sql - TypeScript Sequelize : How to join two tables with common

php - MySQL 使用数字状态代码与文本

Java - JTextArea - 放弃焦点后进行修改?

java - Opencv java - 将图像加载到 GUI

java - 如何从 pc 将当前日期设置为 jDateChooser?

java - getDrawingCache() 返回空指针异常 - Cordova 插件