插入后无法刷新显示的JTable

时间:2015-05-29 12:41:52

标签: java mysql swing

我有问题。我对Java很新,目前我尝试学习一些基本的东西。

所以我用GUI vor输入和Textfield创建了一个小Button,用查询(包含输入作为变量)向我的数据库发出查询。

我在ResultSet填充了查询结果,并希望在JTable中显示结果。 我试着这样做了:

public class AppWindow extends JFrame {

    private ResultSet rs = null;

    JTextField  textfield_where_1;
    JTextField  textfield_where_2;

    JTable tabellenspass;

    JButton     button;


    public AppWindow() {
        this.getContentPane().setLayout(null);

        this.initWindow();

    protected void initWindow() 
    {
        // Instanzieren:
        textfield_where_1 = new JTextField();
        textfield_where_2 = new JTextField();
        tabellenspass = new JTable();


        button = new JButton("muh");

        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                try {
                    Abfrage();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        });

        // Positionen festlegen
        textfield_where_1.setBounds(5,10,400,25);

        tabellenspass.setBounds(5,40,400,100);
        button.setBounds(300,110,100,30);

        // Elemente dem Fenster hinzufügen:
        this.getContentPane().add(textfield_where_1);

        this.getContentPane().add(button);

        this.getContentPane().add(tabellenspass);
        this.pack();
    }

    public void Abfrage() throws Exception
    {
        // Eingabestrings holen
        String eingabe1 = textfield_where_1.getText();

        select_dies_das ausgabe = new select_dies_das();

        rs = ausgabe.select(eingabe1);
        Ausgabe_Tabelle(rs);


    }

    private void Ausgabe_Tabelle(ResultSet rs)
    {
         try
         {

                // Rows / Columns der Tabelle setzen

            ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();
            // Tabellenmodel

            DefaultTableModel model = new DefaultTableModel();
            tabellenspass.setModel(model);

            //model.fireTableRowsInserted(0, 5);
            int columns = rsmd.getColumnCount();

            // Resultset Zeiger zurueck setzen
            rs.beforeFirst();    

            while (rs.next()) {

                Object[] row = new Object[columns];
                    for (int i = 1; i <= columns; i++)
                    {  
                        row[i - 1] = rs.getObject(i);
                    }

                    model.insertRow(rs.getRow() -1,row);
                   System.out.println("miau");
            }

           // tabellenspass.setModel(model);  
            tabellenspass.repaint();
         }
         catch(Exception e)
         {
             System.out.println(e);
         }
    }

使用Abfrage()我得到填充的结果集,并使用Ausgabe_Tabelle()填写JTable,但显示的表格不会更改。

我创建了一行Object[],我用整行的Data填充,Object我插入JTable

使用initWinodw()我创建了一个小GUI。

有人可以解释一下为什么表格在插入后不会刷新吗?

2 个答案:

答案 0 :(得分:4)

我认为问题在于您的BiConsumer未正确初始化,您需要使用TableModel构造函数为其指定public DefaultTableModel(Object[][] data, Object[] columnNames){...}:)

header

当然,您需要根据需要在DefaultTableModel model = new DefaultTableModel(null,new String[]{"Col1","Col2"}); 添加或删除列,而model语句也是不必要的,因为您已使用rs.beforeFirst();检查{是否while loop {1}}使用此ResultSet的{​​{1}}方法生成另一行,如果您使用此语句,还会确认您的next()是可滚动的,或者您将获得

interface

更好地评论这一行

ResultSet

此外,您可以使用此org.postgresql.util.PSQLException: Operation requires a scrollable ResultSet, but this ResultSet is FORWARD_ONLY. 更改//rs.beforeFirst(); 声明 我已经尝试过您的代码,这就是结果

enter image description here

也许您应该考虑将model.insertRow(rs.getRow() - 1, row);添加到model.addRow(row);以保持JTable可见,并将JScrollPane设置为您的设计,类似这样

headers

enter image description here

答案 1 :(得分:0)

要通知JTable有关更改,请使用fireTableDataChanged

  

通知所有侦听器表格行中的所有单元格值可能已更改。

您也可以尝试重新验证并重新绘制或resizeAndRepaint()

tabellenspass.revalidate();
tabellenspass.repaint();

tabellenspass.resizeAndRepaint();

并查看here以获取更多信息......