java - 插入后无法刷新显示的 JTable

标签 java mysql swing

我有一个问题。我是 Java 的新手,目前我正在尝试学习一些基本知识。

所以我创建了一个带有 Textfield 输入和 Button 的小 GUI 以使用查询(即包含输入作为变量)。

我用查询结果填充了一个 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。

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

最佳答案

我认为问题出在未正确初始化的 TableModel 上,您需要使用 public DefaultTableModel(Object[][] data, Object[] columnNames){ ...} 构造函数给它 header 名称 :)

DefaultTableModel model = new DefaultTableModel(null,new String[]{"Col1","Col2"});

当然,您需要根据需要向模型 添加或删除列,而且 rs.beforeFirst(); 语句是不必要的,因为您已经在使用一个 while 循环,它检查 ResultSet 是否有另一行使用此 interfacenext() 方法,如果你使用这个语句,还要确认你的 ResultSet 是可滚动的,否则你会得到一个

org.postgresql.util.PSQLException: Operation requires a scrollable ResultSet, but this ResultSet is FORWARD_ONLY.

最好把这一行注释掉

//rs.beforeFirst();

您还可以使用此 model.addRow(row); 更改您的 model.insertRow(rs.getRow() - 1, row); 语句 我试过你的代码,结果是这样

enter image description here

也许你应该考虑将 JTable 添加到 JScrollPane 以保持可见的 headers,并设置 layouts你的设计,像这样

setTitle("Test");
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
JPanel data = new JPanel();
this.getContentPane().add(textfield_where_1);
this.getContentPane().add(data);
data.add(button);
JScrollPane scroll = new JScrollPane(tabellenspass);
data.add(scroll);
scroll.setPreferredSize(new Dimension(400, 100));
button.setPreferredSize(new Dimension(100, 100));
textfield_where_1.setPreferredSize(new Dimension(400, 25));

enter image description here

关于java - 插入后无法刷新显示的 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30529921/

相关文章:

java - 从 JTextField 中检索文本

MySQL - 如何获取下一行

php - 只允许某些ip访问我的 "family site"?

java - 带有换行且居中对齐文本的 JTable 列标题

java - 如何防止在 JTable 单元格中输入数字以外的字符?

java - JOptionPane showMessageDialog - 取消焦点 'OK' 按钮

java - SSLHandshakeException 可以是可重试的异常吗?

java - 是否为每个请求重复静态初始化?

java - 修改具有多个迭代器的集合时出现问题

插入时的mysql触发器不起作用