TableModel应用实例--新增数据及时刷新显示

这个博客展示了如何在Java中使用TableModel实现日志管理功能,包括编辑、添加、删除和查询操作。通过实例代码解释了如何从数据库获取数据填充JTable,并在执行数据库操作后即时刷新表格显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.sql.rowset.CachedRowSet;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.Border;

import com.OA.Dao.ResultSetTableModel;
import com.OA.Dao.dbsql;
import com.sun.rowset.CachedRowSetImpl;

public class myJournal extends JInternalFrame {
 private JTable table_show;
 private JTextField Ttitle;
 private JTextArea textArea;
 private JTextField Tdate;
 private JComboBox CB_class;
 private ResultSetTableModel model;
 private ResultSet rs;
 private dbsql db;
 private JPanel panel_show;
 private JScrollPane scrollPane_show;

 public myJournal(String title, boolean a, b

class TableModel(QAbstractTableModel): def __init__(self, data=None, headers=None, parent=None): super().__init__(parent) # 初始化数据(二维列表:每行是一个列表,对应表格的一行数据) #self._data = data if data else [] self._data = [] # 列标题(列表,如["姓名", "年龄", "性别"]) #self._headers = headers if headers else [] self._headers = ["SID", "Time", "Chn", "T/Rx", "ID_index", " SendType", "RemoteFlag", "ExternFlag", "Len", "Data(hex)", "button"] def rowCount(self, parent=QModelIndex()): #"""返回行数(必须重写)""" return len(self._data) def columnCount(self, parent=QModelIndex()): #"""返回列数(必须重写)""" # new 0722 # return len(self._headers) if self._data else 0 return len(self._headers) # new 0722 # 单元格数据 def data(self, index, role=Qt.DisplayRole): #"""返回指定位置的数据(必须重写)""" # new 0723 if role == Qt.TextAlignmentRole: return Qt.AlignCenter # new 0723 if not index.isValid() or role != Qt.DisplayRole: return None # 仅处理显示角色(DisplayRole) row = index.row() col = index.column() # new 0723 if role == Qt.DisplayRole and col == 0: value = self._data[row][col].split(" ")[0] return str(value) # new 0723 if row >= len(self._data) or col >= len(self._headers): return None return self._data[row][col] # 返回第row行第col列的数据 # 表头 def headerData(self, section, orientation, role=Qt.DisplayRole): #"""返回列标题(可选重写)""" if orientation == Qt.Horizontal and role == Qt.DisplayRole: return self._headers[section] if section < len(self._headers) else None # new 添加行号行头 0721 if orientation == Qt.Vertical and role == Qt.DisplayRole: return str(section + 1) # new 添加行号行头 0721 return None # 垂直标题(行号)默认使用行索引,无需额外处理 def add_row(self, row_data): #"""动态添加一行数据(触发视图更新)""" # 通知视图:开始插入行(参数:父索引、插入位置起始行、结束行) self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount()) self._data.append(row_data) # 实际添加数据到模型 self.endInsertRows() # 通知视图:插入完成 # def update_data(self, row, col, new_value): # #"""更新指定位置的数据(触发视图刷新)""" # if 0 <= row < len(self._data) and 0 <= col < len(self._headers): # self._data[row][col] = new_value # # 通知视图:指定位置数据已修改(参数:起始索引、结束索引) # self.dataChanged.emit(self.index(row, col), self.index(row, col)) # new 清理表格功能 0721 def clear_Table(self): rows = self.rowCount() if rows > 0: # self.beginResetModel(QModelIndex(), 0, rows -1) # new 0722 self.beginResetModel() self._data = [] # 清空数据 self.endResetModel() # 通知视图重置完成 通过修改此代码,将获取的报文写入txt中节省内存空间
最新发布
07-25
可以代码如何修改,实现更新首行标题??import sys from PySide6.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QStackedWidget, QLineEdit, QTableView, QPushButton, QHBoxLayout, QLabel ) from PySide6.QtCore import Qt, QAbstractTableModel # 示例表格模型 class TableModel(QAbstractTableModel): def __init__(self, data): super().__init__() self._data = data def rowCount(self, parent): return len(self._data) def columnCount(self, parent): return len(self._data[0]) if self._data else 0 def data(self, index, role): if role == Qt.DisplayRole: return self._data[index.row()][index.column()] return None class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("多页界面示例") self.setGeometry(100, 100, 600, 400) # 创建主控件和布局 central_widget = QWidget() self.setCentralWidget(central_widget) main_layout = QVBoxLayout(central_widget) # 创建堆叠窗口部件 self.stacked_widget = QStackedWidget() main_layout.addWidget(self.stacked_widget) # 创建导航按钮布局 button_layout = QHBoxLayout() main_layout.addLayout(button_layout) # 创建页面1:输入页 page1 = QWidget() page1_layout = QVBoxLayout(page1) page1_layout.addWidget(QLabel("第一页:输入数据")) self.line_edit = QLineEdit() self.line_edit.setPlaceholderText("在此输入内容...") page1_layout.addWidget(self.line_edit) # 创建页面2:表格页 page2 = QWidget() page2_layout = QVBoxLayout(page2) page2_layout.addWidget(QLabel("第二页:表格展示")) self.table_view = QTableView() # 示例数据 data = [ ["姓名", "年龄", "城市"], ["张三", 25, "北京"], ["李四", 30, "上海"], ["王五", 28, "广州"] ] self.model = TableModel(data) self.table_view.setModel(self.model) page2_layout.addWidget(self.table_view) # 添加页面到堆叠窗口 self.stacked_widget.addWidget(page1) self.stacked_widget.addWidget(page2) # 创建导航按钮 self.btn_page1 = QPushButton("转到输入页") self.btn_page1.clicked.connect(lambda: self.switch_page(0)) button_layout.addWidget(self.btn_page1) self.btn_page2 = QPushButton("转到表格页") self.btn_page2.clicked.connect(lambda: self.switch_page(1)) button_layout.addWidget(self.btn_page2) # 添加提交按钮 self.submit_btn = QPushButton("提交数据") self.submit_btn.clicked.connect(self.submit_data) button_layout.addWidget(self.submit_btn) def switch_page(self, index): """切换页面""" self.stacked_widget.setCurrentIndex(index) def submit_data(self): """提交数据示例""" text = self.line_edit.text() if text: print(f"提交的数据: {text}") # 这里可以添加实际的数据处理逻辑 if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
06-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值