JTable 未更新

Posted

技术标签:

【中文标题】JTable 未更新【英文标题】:JTable not updating 【发布时间】:2013-03-25 14:20:39 【问题描述】:

我正在尝试通过在 java swing 中使用表来创建一个表并向 sql 添加值。但是在 for 循环中,我根本没有增加。我认为这是因为while(rs2.next())。当我把它放在for循环之外时,我得到这个错误:“在结果集开始之前”。我需要帮助!

编辑:上面的问题已经解决,但我现在有新问题。 JTable 似乎没有更新自己。当我在组合框中选择表名时,表应用程序崩溃并给出数组索引超出范围异常。

我的代码在这里:

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;

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];
                 table = new JTable(1,columnCount);
                 Object columnNames[] = new Object[columnCount];
                 Object rowData[][] = "";

                     for(int i=0;i<columnCount;i++)

                         sutunlar[i] = rsmd.getColumnLabel(i+1);
                         columnNames[i] = sutunlar[i];

                         

                     table = new JTable(rowData, columnNames);
                     table.repaint();
                     scrollPane = new JScrollPane(table);
                     sutunPanel.add(scrollPane);
                     sutunPanel.revalidate();

             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);
  

【问题讨论】:

你为什么要循环列数?使用while,您已经浏览了所有返回的行。 我想获取特定表中的列名。因此,如果该表有 3 列,我必须进入循环 3 次。我错了吗? columnCount 的值是多少? 其实columnCount 有一些错误。现在它的值是 23,但 23 是数据库中的所有列。我想要特定表中的列数,但这并不重要,因为 set 负责处理空值。 tablo 应该是rs.getString(2) + "." + rs.getString(3) 【参考方案1】:

我认为for循环没有问题。

while(rs2.next())


当 i 的其他迭代条件为假且不进入 while 循环时执行此操作。

如果你想测试,你可以这样做:

for(int i=0;i<columnCount;i++)  

    while(rs2.next())              

       sutunlar[i] = rs2.getString(4);
       Set<String> setSutunlar = new HashSet<>(Arrays.asList(sutunlar[i]));
       Object rowData[][] = null;
       Object columnNames[] = setSutunlar;
       table = new JTable(rowData, columnNames);
       scrollPane = new JScrollPane(table);
       sutunPanel.add(scrollPane);
    

    System.out.println("Value of i is " + i);// Add this line to check iteration of i.

【讨论】:

这是我写在这里之前的代码。我在调试模式下检查了 i,当它进入 while 循环时,我再次变为 0。 @Miral 这怎么可能。我认为当 rs.next() 变为 fales 并且它不进入 while 循环之后 i 的值为零时,您的 while 循环只会执行一次。【参考方案2】:

我认为你混淆了一些东西。当你定义

columnCount = rsmd.getColumnCount();

您似乎希望columnCount 保存表格的列数;但这种情况并非如此。这是元数据提供的列数。

如果您想获取所选表的列名,请将其放入您的 try/catch 块中:

ResultSet rs2 = md.getColumns(null, null, tablo, null);

Set<String> columnNames = new HashSet<String>();
while (rs2.next()) 
  columnNames.add(rs2.getString(4));


Object[][] rowData =  null ;
table = new JTable( null , columnNames.toArray());
scrollPane = new JScrollPane(table);
sutunPanel.add(scrollPane);

你应该真正考虑一下你对静态字段的使用;)

【讨论】:

以上是关于JTable 未更新的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 DefaultTableModel 从 CachedRowSet 填充 jTable 时,为啥 JTable 的列标题没有更新?

从 jTable 更新 SQL Server 表

单元格选择后更新数据库(JTable)

使用 JButton 更新 JTable

根据查询更新JTable显示(转)

使用日期类型更新 JTable 单元格