Java 未显示JTable刷新的数据
这是一个JDBC项目。WAMP服务器上mySql数据库中的数据显示在jtable中。现在,我希望用户在我的Spinnerbutton上输入ID并删除具有该ID的行。我进行了SQL查询,所有操作都正常,但执行查询时myjtable上的数据不会刷新。我单击我的JNazad按钮(我的后退按钮),然后重新进入该窗口,以便我的Jtable显示刷新的数据。我认为我在NapGravitablicu方法中没有正确实现FireTableModel,但不知道我做错了什么:Java 未显示JTable刷新的数据,java,mysql,swing,jdbc,jtable,Java,Mysql,Swing,Jdbc,Jtable,这是一个JDBC项目。WAMP服务器上mySql数据库中的数据显示在jtable中。现在,我希望用户在我的Spinnerbutton上输入ID并删除具有该ID的行。我进行了SQL查询,所有操作都正常,但执行查询时myjtable上的数据不会刷新。我单击我的JNazad按钮(我的后退按钮),然后重新进入该窗口,以便我的Jtable显示刷新的数据。我认为我在NapGravitablicu方法中没有正确实现FireTableModel,但不知道我做错了什么: public class GUIBDele
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("sun.jdbc.odbc.JdbcOdbcDriver");
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);
model.fireTableDataChanged();
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();
model.fireTableDataChanged();
}
private void IzvrsiQuery() {
Object sp = Spinner.getValue();
ID = sp.toString();
SqlQuery=SqlQuery+ID;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
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 = 1;
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 = 3;
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
,我只是用napraviablicu
方法创建模型,然后在构造函数中使用该模型,只需将其添加到表Tablica
,但现在该表不显示任何数据。我不知道我在代码中是否正确实现了您的提示
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 void 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);
//model.fireTableDataChanged();
}
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();
//model.fireTableDataChanged();
}
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", "");
PreparedStatement Stat = (PreparedStatement) 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=new JTable(model);
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 = 1;
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 = 3;
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();
}
});
}
}
公共类GUIBDelete扩展了JFrame{
私人喷丝头模型;
私人纺纱机;
私人JLabel LUnos;
比兹夫尔西的杰布顿·巴纳扎德私人酒店;
私有字符串ID,SqlQuery;
私有向量NaziviKolona=新向量();
私有向量Podaci=新向量();
私有JTable Tablica=新JTable();
私有JScrollPane滚动窗格;
私有模型;
私有无效的可剥夺的权利(){
试一试{
String SqlQuery=“从'nfc_baza'中选择*”;
Podaci.clear();
NaziviKolona.clear();
Class.forName(“com.mysql.jdbc.Driver”);
Connection con=DriverManager.getConnection(“jdbc:mysql://”
+“本地主机:3306/nfc”、“根目录”、“根目录”);
Statement Stat=con.createStatement();
ResultSet Rez=Stat.executeQuery(SqlQuery);
ResultSetMetaData md=Rez.getMetaData();
int columns=md.getColumnCount();
对于(inti=1;i您需要使用com.mysql.jdbc.Driver
作为jdbc
驱动程序,而不是通用的jdbc/ODBC
驱动程序。此外,也不需要调用fireTableDataChanged
,您的TableModel
将在引擎罩下调用它
旁注:
- 无需每次都创建
JTable
。DefaultTableModel
是一个可更新的可变TableModel
PreparedStatement
被认为比Statement
- 如果不添加新功能,则无需扩展
JFrame
。首选直接实例
- 可维护性考虑将数据库/非UI代码与UI代码分开。
更新:
要创建PreparedStatement
,请使用Connection#prepareStatement
而不是Connection#createStatement
PreparedStatement Stat = con2.prepareStatement(SqlQuery);
然后,在执行查询时,有必要将execute
语句与空一起使用
参数列表:
int rez = stat.executeUpdate();
最好将语句
和连接
和关闭
语句放在最后
块中。
Java使用一个小写字母作为变量名,这将使SqlQuery
SqlQuery
您需要使用com.mysql.jdbc.Driver
作为jdbc
驱动程序,而不是通用的jdbc/ODBC
驱动程序。此外,也不需要调用fireTableDataChanged
,您的表格模型代码>将在引擎盖下调用此代码
旁注:
- 无需每次都创建
JTable
。DefaultTableModel
是一个可更新的可变TableModel
PreparedStatement
被认为比Statement
- 如果不添加新功能,则无需扩展
JFrame
。首选直接实例
- 可维护性考虑将数据库/非UI代码与UI代码分开。
更新:
要创建PreparedStatement
,请使用Connection#prepareStatement
而不是Connection#createStatement
PreparedStatement Stat = con2.prepareStatement(SqlQuery);
然后,在执行查询时,有必要将execute
语句与空一起使用
参数列表:
int rez = stat.executeUpdate();
最好将语句
和连接
和关闭
语句放在最后
块中。
Java使用一个小写字母作为变量名,这将使SqlQuery
SqlQuery
也无需重新创建表,只需更改表模型即可更新ui+1-此外,SwingWorker
将有助于阻止ui“停止”当您从数据库获取值时…也不需要重新创建表,只需更改表模型即可更新ui+1-此外,SwingWorker
将有助于阻止ui“停止”当您从数据库中获取值时……请学习java命名约定并坚持它们。请学习java命名约定并坚持它们。