gpt4 book ai didi

java - 执行数据库查询时 JTable 不刷新

转载 作者:行者123 更新时间:2023-12-01 14:48:21 24 4
gpt4 key购买 nike

这是一个 JDBC 项目。 WAMP 服务器上 MySQL 数据库中的数据显示在 JTable 中。我希望在 JSpinner 上输入用户输入的 ID,以从表中删除具有该 ID 的行。我进行了 SQL 查询,一切正常,但执行查询时,JTable 上的数据不会刷新。我单击 JNazad 按钮(我的后退按钮),然后重新进入该窗口,以便我的 JTable 显示刷新的数据。我没有在 NapraviTablicu 方法中实现 FireTableModel,因为它是 DefaultTableModel,并且更新是用它自动完成的。我不知道我做错了什么:

public class GUIBDelete extends JFrame{

private SpinnerModel SM;
private JSpinner Spinner;
private JLabel LUnos;
private JButton BNazad, BIzvrsi;
private String ID, SqlQuery;
private Vector NaziviKolona = new Vector();
private Vector Podaci = new Vector();
private JTable Tablica=new JTable();
private JScrollPane ScrollPane;
private DefaultTableModel model;


private JTable NapraviTablicu(){
try {
String SqlQuery = "SELECT * FROM `nfc_baza`";
Podaci.clear();
NaziviKolona.clear();
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://"
+ "localhost:3306/nfc", "root", "");

Statement Stat = con.createStatement();
ResultSet Rez = Stat.executeQuery(SqlQuery);
ResultSetMetaData md = Rez.getMetaData();
int columns = md.getColumnCount();
for (int i = 1; i <= columns; i++) {
NaziviKolona.addElement(md.getColumnName(i));
}
while (Rez.next()) {
Vector red = new Vector(columns);
for (int i = 1; i <= columns; i++) {
red.addElement(Rez.getObject(i));
}
Podaci.addElement(red);
}
Rez.close();
Stat.close();
con.close();
} catch (Exception e) {
System.out.println(e);
}
model = new DefaultTableModel(Podaci, NaziviKolona);
JTable table = new JTable(model);

return table;

}

ActionListener a1 = new ActionListener() {
public void actionPerformed(ActionEvent a) {
dispose();
new GUIIzbornik();
}
};


ActionListener a2 = new ActionListener() {
public void actionPerformed(ActionEvent a) {
ID=null;
SqlQuery = "DELETE FROM `nfc`.`nfc_baza` WHERE `nfc_baza`.`ID` = ";
IzvrsiQuery();
}

private void IzvrsiQuery() {
Object sp = Spinner.getValue();
ID = sp.toString();
SqlQuery=SqlQuery+ID;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con2 = DriverManager.getConnection(
"jdbc:mysql://" + "localhost:3306/nfc", "root", "");
Statement Stat = con2.createStatement();
int Rez = Stat.executeUpdate(SqlQuery);
Stat.close();
con2.close();
JOptionPane.showMessageDialog(null, "Uspješno izvrseno!",
"Poruka!", JOptionPane.INFORMATION_MESSAGE);

} catch (Exception e) {
System.out.println(e);
}

}
};


GUIBDelete(){
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

Tablica=NapraviTablicu();
ScrollPane = new JScrollPane(Tablica);
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(2, 2, 2, 2);
c.weightx = 0.1;
c.weighty = 0.1;
c.gridwidth = 4;
c.gridheight = 2;
c.gridx = 0;
c.gridy = 0;
add(ScrollPane, c);


LUnos= new JLabel("<html><br>Unesite ID elementa</br> kojeg želite obrisati:<html>");
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 1;
c.gridheight = 1;
add(LUnos, c);

SM = new SpinnerNumberModel(1, 1, 1000, 1);
Spinner = new JSpinner(SM);
c.gridx = 2;
c.gridy = 2;
c.gridwidth = 2;
add(Spinner, c);

BNazad = new JButton("Nazad");
c.gridx = 0;
c.gridy = 3;
c.gridwidth = 1;
BNazad.addActionListener(a1);
add(BNazad, c);

BIzvrsi = new JButton("Izvrši");
c.gridx = 2;
c.gridy = 3;
BIzvrsi.addActionListener(a2);
add(BIzvrsi, c);

setSize(400, 500);
setTitle("Brisanje podataka");
setVisible(true);
setLocationRelativeTo(null);

}


public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GUIBDelete i = new GUIBDelete();
}
});
}
}

最佳答案

看起来您正在从数据库表中删除一行,并且希望 JTable 反射(reflect)更改。在 izvrsiQuery() 中更新您的 TableModelJTable 将自行更新。例如,

...
con2.close();
model.removeRow(((Number)(spinner.getValue())).intValue() - 1);
JOptionPane.showMessageDialog(...);
...

请注意,行号从 0 开始,使用 RowSorter 时必须对其进行转换。

顺便说一句,如果您使用常见的 Java 命名约定并分解常量,您的代码将更容易被其他人阅读。

附录:该示例只是按数字删除一行。您必须在 TableModel 中搜索与已删除的 ID 对应的行。

附录:尽管不太实用,但您可能希望在使用 setModel() 执行 DML 操作后刷新数据库中的整个表,如 here 所示。 .

关于java - 执行数据库查询时 JTable 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15156255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com