当我从组合框中的数据库中选择一个表格时,我希望我的jtable更新。但没有任何反应,程序给出数组索引超出范围的异常。我使用了repaint()
和revalidate()
函数,但我找不到解决方案。
编辑:我现在在此处有空指针异常:table.setModel(tableModel);
public class DBC extends JFrame{
static String tablo;
static JTextField tf = new JTextField(20);
static int columnCount;
static JPanel tfPanel = new JPanel();
static String[] sutunlar;
static JLabel sutunLabel;
static JPanel sutunPanel = new JPanel(new BorderLayout());
static JTable table;
static JScrollPane scrollPane;
static DefaultTableModel tableModel;
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/project"
,"root","123456789");
final Statement statement = connect.createStatement();
JLabel tabloSec = new JLabel("Tablo Seçin:");
final JComboBox<String> tablolar = new JComboBox<String>();
final DatabaseMetaData md = connect.getMetaData();
final ResultSet rs = md.getTables(null, null, "%", null);
while (rs.next()) {
tablolar.addItem(rs.getString(3));
}
tablolar.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
tablo = tablolar.getSelectedItem().toString();
try {
ResultSet rs2 = statement.executeQuery("SELECT * FROM "+tablo);
ResultSetMetaData rsmd = rs2.getMetaData();
columnCount = rsmd.getColumnCount();
sutunlar = new String[columnCount];
Object columnNames[] = new Object[columnCount];
Object rowData[][] = {{""}};
tableModel = new DefaultTableModel(rowData, columnNames);
for(int i=0;i<columnCount;i++){
sutunlar[i] = rsmd.getColumnLabel(i+1);
columnNames[i] = sutunlar[i];
}
tableModel.addRow(rowData);
tableModel.addColumn(columnNames);
table.setModel(tableModel);
table.repaint();
scrollPane = new JScrollPane(table);
sutunPanel.add(scrollPane);
sutunPanel.revalidate();
sutunPanel.repaint();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
JButton ekle = new JButton("Ekle");
ekle.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
try {
switch(tablo){
case "department":
statement.executeUpdate("INSERT INTO department(Name,Location) VALUES('"+tf.getText()+"')");
case "employee":
statement.executeUpdate("INSERT INTO employee(Id,FirstName,LastName,Sex,Address,Email,Salary,BirthDate,JoinDate) VALUES('"+tf.getText()+"')");
case "engineer":
statement.executeUpdate("INSERT INTO engineer(EngineerType) VALUES('"+tf.getText()+"')");
case "manager":
statement.executeUpdate("INSERT INTO manager(Department) VALUES('"+tf.getText()+"')");
case "project":
statement.executeUpdate("INSERT INTO project(Name,Number,Value) VALUES('"+tf.getText()+"')");
case "secretary":
statement.executeUpdate("INSERT INTO secretary(TypingSpeed) VALUES('"+tf.getText()+"')");
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
JButton cik = new JButton("Çık");
cik.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
JPanel panel = new JPanel(new FlowLayout());
panel.add(tabloSec);
panel.add(tablolar);
panel.add(sutunPanel);
panel.revalidate();
panel.add(ekle);
panel.add(cik);
JFrame frame = new JFrame("Deneme");
frame.setSize(600,600);
frame.setLocationRelativeTo(null);
frame.add(panel);
frame.setVisible(true);
}
}
答案 0 :(得分:3)
您不应该替换JTable
table = new JTable(1,columnCount);
相反,请更新现有的TableModel
或创建新的TableModel
并使用JTable#setModel
替换模型。
答案 1 :(得分:1)
但没有任何反应,程序会给出数组索引超出范围的异常。
不要使用Arrays,因为您不知道将从SQL查询返回的数据量。
您应该使用Vector作为列名称。您还需要第二个Vector数据。最后,对于返回的每一行,您需要一个新的Vector,您将其添加到数据Vector。
目前,您的代码甚至没有尝试从ResultSet获取数据。您只获得了不太有用的列名称。
获得所有数据后,使用columnName Vector和数据Vector创建一个新的DefaultTableModel。然后使用table.setModel()方法更新表。
答案 2 :(得分:0)
尝试从数据库中获取数据后添加SwingUtilities.invokeLater()。它可能是一个事件派遣问题。另外,不要在actionListener()中构造GUI组件(这会导致问题)