【问题标题】:Cant refresh the shown JTable after inserts插入后无法刷新显示的 JTable
【发布时间】:2015-05-29 12:41:52
【问题描述】:

我有问题。我对Java 还很陌生,目前我正在尝试学习一些基本的东西。

所以我创建了一个带有Textfield vor 输入和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。

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

【问题讨论】:

  • 尝试“model.addRow”而不是“model.insertRow”

标签: java mysql swing


【解决方案1】:

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

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

当然,您需要根据需要向model 添加或删除列,rs.beforeFirst(); 语句也是不必要的,因为您已经在使用while loop 来检查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); 语句 我试过你的代码,结果是这样的

也许您应该考虑将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));

【讨论】:

  • 嘿,我用的是 rs.beforefirst();因为我已经在查询后在控制台中进行了打印以检查是否有结果。 (对我来说只是一个测试,因为正如我所说,我尝试学习一些基础知识;D)好的,我会试试你的东西,希望它也对我有用。
  • @user3793935 这已解决,但请阅读编辑后的答案:)
【解决方案2】:

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

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

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

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

tabellenspass.resizeAndRepaint();

查看here 了解更多信息...

【讨论】:

  • 嗨!嗯,我不能在 JTable 上使用它,但在模型上。但它仍然没有改变任何东西;((顺便说一句,结果集不是空的,该行包含 213 列,其中填充了超过 5 行的数据)
  • Mhm 不起作用。 initWindow 过程可能有问题吗?或者我可能没有使用正确的变量?
  • 然后检查@Osuka的答案!
猜你喜欢
  • 2014-09-06
  • 1970-01-01
  • 2014-08-11
  • 2015-06-03
  • 2012-01-07
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
相关资源
最近更新 更多