【问题标题】:Refresh JFrame contents DefaultTableModel刷新 JFrame 内容 DefaultTableModel
【发布时间】:2018-10-01 20:37:08
【问题描述】:

我正在尝试使用另一个站点的示例来弄清楚如何在模型发生更改后更新表格窗口。一切正常,但是一旦表格模型发生更改,我不知道如何刷新窗口。

编辑:我使用了 Bell 的建议并重新安排了一些事情,以便构造函数调用我的 getmodel3 方法来填充表格。我以为我可以使用 setmodel 方法来更改模型并更新表格,但它并没有像我想象的那样工作。以下是我认为会发生但没有发生的情况:

  1. main 方法使用从getmodel3 方法传递的模型创建表的新实例。
  2. 构建表后,我调用setmodel 方法,使用getmodel4 返回的模型将不同的数据加载到新模型中。
  3. 第 1 步中的实例使用新模型数据进行更新,新数据显示在表格中。

实际发生的情况是,创建了一个新实例并使用从 getmodel3 返回的模型,然后 setmodel 方法运行并从不同的数据集更新模型变量,但表格没有显示改变。

    public class myTable extends JFrame
    {

    public volatile DefaultTableModel model = (DefaultTableModel) myTable.getmodel3();

    public void setmodel(DefaultTableModel newModel) 
    {
        this.model = newModel;
    }

    public myTable()
    {
        JTable table = new JTable( model );
        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
        JPanel buttonPanel = new JPanel();
        getContentPane().add( buttonPanel, BorderLayout.SOUTH );
    }

    public static void main(String[] args)
    {
        myTable frame = new myTable();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
        frame.setmodel(getmodel4());
    }   

这里是getmodel3,它与getmodel4 相同,只是它们指向不同数据的不同数据库文件。

    public static DefaultTableModel getmodel3(){
    Vector<Object> columnNames = new Vector<Object>();
    Vector<Object> data = new Vector<Object>();

    try
    {
        //  Connect to an Access Database

        String url = "jdbc:sqlite:c:\\sqlite3\\test.db";
        Connection conn = DriverManager.getConnection(url);

        //  Read data from a table

        String sql = "Select * from Tasks";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery( sql );
        ResultSetMetaData md = rs.getMetaData();
        int columns = md.getColumnCount();

        //  Get column names

        for (int i = 1; i <= columns; i++)
        {
            columnNames.addElement( md.getColumnName(i) );
        }

        //  Get row data

        while (rs.next())
        {
            Vector<Object> row = new Vector<Object>(columns);

            for (int i = 1; i <= columns; i++)
            {
                row.addElement( rs.getObject(i) );
            }

            data.addElement( row );
        }

        rs.close();
        stmt.close();
        conn.close();
    }
    catch(Exception e)
    {
        System.out.println( e );
    }

    //  Create table with database data

    DefaultTableModel model = new DefaultTableModel(data, columnNames)
    {
        @Override
        public Class getColumnClass(int column)
        {
            for (int row = 0; row < getRowCount(); row++)
            {
                Object o = getValueAt(row, column);

                if (o != null)
                {
                    return o.getClass();
                }
            }

            return Object.class;
        }
    };
System.out.println("got model");

return model;

}

【问题讨论】:

  • 这项技术已经死了。
  • 要么创建新的TableModel 并应用于现有的JTable,要么更新模型本身的数据
  • 我可以更新模型中的数据,但表格没有显示更改。

标签: java jframe refresh defaulttablemodel


【解决方案1】:

您可以使用table.getModel() 使用现有模型,并使用table.setModel(yourModel) 设置新/现有模型

DefaultTableModel model = (DefaultTableModel) table.getModel();
// do modification here
table.setModel(model);

【讨论】:

  • 谢谢,getModel 正在工作,但 setModel 没有刷新窗口。有什么想法吗?
【解决方案2】:

嗯,在你的帮助下,我终于想通了。 setModel 不起作用,因为 1,它无法从我尝试使用它的方法的范围内访问,2 我试图制作自己的 setter setmodel 但我不知道我在做什么: )。

最后,我在一个更容易到达的地方进行了初始化,所以我没有在其他方法中弄乱对象。这是调用 main 时加载表的工作结果,稍后我可以调用 update 方法重新加载它。感谢各位的帮助。

public class able extends JFrame
{

//initialize here for easy access.  getmodel3() is the model getter method and 
//returns the defaultTableModel object

private static able frame =  new able();
private static JTable table = new JTable( getmodel3() );

//Start all main stuff here using the previously initialized objects.

public static void main(String[] args)
{
    JScrollPane scrollPane = new JScrollPane( table );
    frame.getContentPane().add( scrollPane );
    JPanel buttonPanel = new JPanel();
    frame.getContentPane().add( buttonPanel, BorderLayout.SOUTH );

    frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible(true);

}   

public static void update()
{
   table.setModel(getmodel3());
}

//This method makes the table model from sql result set and returns it.    
//(found online somewhere thanks to whoever wrote it)

public static DefaultTableModel getmodel3(){
    Vector<Object> columnNames = new Vector<Object>();
    Vector<Object> data = new Vector<Object>();

    try
    {
        //  Connect to an Access Database

        String url = "jdbc:sqlite:c:\\sqlite3\\test.db";
        Connection conn = DriverManager.getConnection(url);

        //  Read data from a table

        String sql = "Select * from Tasks";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery( sql );
        ResultSetMetaData md = rs.getMetaData();
        int columns = md.getColumnCount();

        //  Get column names

        for (int i = 1; i <= columns; i++)
        {
            columnNames.addElement( md.getColumnName(i) );
        }

        //  Get row data

        while (rs.next())
        {
            Vector<Object> row = new Vector<Object>(columns);

            for (int i = 1; i <= columns; i++)
            {
                row.addElement( rs.getObject(i) );
            }

            data.addElement( row );
        }

        rs.close();
        stmt.close();
        conn.close();
    }
    catch(Exception e)
    {
        System.out.println( e );
    }

    //  Create table with database data

    DefaultTableModel model3 = new DefaultTableModel(data, columnNames)
    {
        @Override
        public Class getColumnClass(int column)
        {
            for (int row = 0; row < getRowCount(); row++)
            {
                Object o = getValueAt(row, column);

                if (o != null)
                {
                    return o.getClass();
                }
            }

            return Object.class;
        }
    };
System.out.println("got model");

return model3;
 }

public static DefaultTableModel getmodel4(){
    Vector<Object> columnNames = new Vector<Object>();
    Vector<Object> data = new Vector<Object>();

    try
    {
        //  Connect to an Access Database

        String url = "jdbc:sqlite:c:\\sqlite3\\test2.db";
        Connection conn = DriverManager.getConnection(url);

        //  Read data from a table

        String sql = "Select * from Tasks";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery( sql );
        ResultSetMetaData md = rs.getMetaData();
        int columns = md.getColumnCount();

        //  Get column names

        for (int i = 1; i <= columns; i++)
        {
            columnNames.addElement( md.getColumnName(i) );
        }

        //  Get row data

        while (rs.next())
        {
            Vector<Object> row = new Vector<Object>(columns);

            for (int i = 1; i <= columns; i++)
            {
                row.addElement( rs.getObject(i) );
            }

            data.addElement( row );
        }

        rs.close();
        stmt.close();
        conn.close();
    }
    catch(Exception e)
    {
        System.out.println( e );
    }

    //  Create table with database data

    DefaultTableModel model3 = new DefaultTableModel(data, columnNames)
    {
        @Override
        public Class getColumnClass(int column)
        {
            for (int row = 0; row < getRowCount(); row++)
            {
                Object o = getValueAt(row, column);

                if (o != null)
                {
                    return o.getClass();
                }
            }

            return Object.class;
        }
    };
System.out.println("got model");

return model3;
 }


}

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 2013-03-29
    • 2012-09-21
    • 2016-04-24
    • 2015-06-03
    • 2010-12-01
    • 2013-02-22
    • 2013-05-05
    • 2015-12-18
    相关资源
    最近更新 更多