Java 从另一个类访问jtable

Java 从另一个类访问jtable,java,mysql,swing,jtable,Java,Mysql,Swing,Jtable,我发现了类似的项目,但我就是不能掌握如何做的概念。我有一个叫做HealthTracker的类,它包含一个JTable。然后我有另一个名为SQL的类,它拥有我所有与SQL相关的方法。其中一个方法称为populateTable。我可以执行查询等操作,但我不知道如何从SQL类访问HealthTracker类中的JTable。下面是我的SQL类中的代码 public void populateTable(int qryType){ try{ DefaultTableModel

我发现了类似的项目,但我就是不能掌握如何做的概念。我有一个叫做HealthTracker的类,它包含一个JTable。然后我有另一个名为SQL的类,它拥有我所有与SQL相关的方法。其中一个方法称为populateTable。我可以执行查询等操作,但我不知道如何从SQL类访问HealthTracker类中的JTable。下面是我的SQL类中的代码

public void populateTable(int qryType){ 
    try{
        DefaultTableModel tblModel = new DefaultTableModel(){
           @Override
           public boolean isCellEditable(int row, int column){
              return false;
           }
        };

        Connection dbconn = SQL.dbConn();
        Statement stmt = dbconn.createStatement();

        String qry = "SELECT * FROM Services";
        ResultSet rs = stmt.executeQuery(qry);

        int numCols = rs.getMetaData().getColumnCount();            
        for (int col = 1; col <= numCols; col++){
            tblModel.addColumn(rs.getMetaData().getColumnLabel(col));
        }

        int row = 0;
        while (rs != null && rs.next()){
            tblModel.addRow(new Object[0]);
            tblModel.setValueAt(rs.getString("ServiceID"), row, 0);
            tblModel.setValueAt(rs.getString("Institution"), row, 1);
            tblModel.setValueAt(rs.getString("Comments"), row, 2);
            row++;
        }   
        rs.close(); 

        // This is the line that gives me the error
        HealthTracker.this.tblMain.setModel(tblModel);

    } catch (Exception e){
        e.printStackTrace();
    }
}

让您的
populateTable
方法返回
TableModel
的实例,而不是让它尝试将模型应用于
JTable

public TableModel populateTable(int qryType) throws SQLException{ 
    DefaultTableModel tblModel = new DefaultTableModel(){
       @Override
       public boolean isCellEditable(int row, int column){
          return false;
       }
    };
    String qry = "SELECT * FROM Services";
    try (Connection dbconn = SQL.dbConn(); 
        Statement stmt = dbconn.createStatement();
        ResultSet rs = stmt.executeQuery(qry)) {

        int numCols = rs.getMetaData().getColumnCount();            
        for (int col = 1; col <= numCols; col++){
            tblModel.addColumn(rs.getMetaData().getColumnLabel(col));
        }

        int row = 0;
        while (rs != null && rs.next()){
            tblModel.addRow(new Object[0]);
            tblModel.setValueAt(rs.getString("ServiceID"), row, 0);
            tblModel.setValueAt(rs.getString("Institution"), row, 1);
            tblModel.setValueAt(rs.getString("Comments"), row, 2);
            row++;
        }   
    }
    return model;
}
publicTableModelPopulateTable(int qryType)抛出SQLException{
DefaultTableModel tblModel=新的DefaultTableModel(){
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
};
String qry=“从服务中选择*”;
try(连接dbconn=SQL.dbconn();
语句stmt=dbconn.createStatement();
结果集rs=stmt.executeQuery(qry)){
int numCols=rs.getMetaData().getColumnCount();

例如(int col=1;col让您的
populateTable
方法返回
TableModel
的实例,而不是让它尝试将模型应用于
JTable

public TableModel populateTable(int qryType) throws SQLException{ 
    DefaultTableModel tblModel = new DefaultTableModel(){
       @Override
       public boolean isCellEditable(int row, int column){
          return false;
       }
    };
    String qry = "SELECT * FROM Services";
    try (Connection dbconn = SQL.dbConn(); 
        Statement stmt = dbconn.createStatement();
        ResultSet rs = stmt.executeQuery(qry)) {

        int numCols = rs.getMetaData().getColumnCount();            
        for (int col = 1; col <= numCols; col++){
            tblModel.addColumn(rs.getMetaData().getColumnLabel(col));
        }

        int row = 0;
        while (rs != null && rs.next()){
            tblModel.addRow(new Object[0]);
            tblModel.setValueAt(rs.getString("ServiceID"), row, 0);
            tblModel.setValueAt(rs.getString("Institution"), row, 1);
            tblModel.setValueAt(rs.getString("Comments"), row, 2);
            row++;
        }   
    }
    return model;
}
publicTableModelPopulateTable(int qryType)抛出SQLException{
DefaultTableModel tblModel=新的DefaultTableModel(){
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
};
String qry=“从服务中选择*”;
try(连接dbconn=SQL.dbconn();
语句stmt=dbconn.createStatement();
结果集rs=stmt.executeQuery(qry)){
int numCols=rs.getMetaData().getColumnCount();

对于(int col=1;col),这很好,但是我仍然需要能够从其他类访问该JTable。请参阅应用程序首次加载以初始化表时发生的代码,但用户需要能够筛选数据。因此,我创建了一个显示另一个窗口的筛选按钮(SearchRecord.java类)用户可以在其中输入参数,然后单击“查找”。一旦“查找”单击按钮,然后我运行查询,应该用新结果重新加载表。也许我的方法不对?那么?为什么不能在需要时加载正在执行查询的类的另一个实例?但是,您可以利用
JTable
s内置的筛选支持,有关更多详细信息,请参阅我想我是这样的做得不对,因为我不能让我刚才添加的代码正常工作。很抱歉我的无知,但这是我第一个关于java的项目。我以前从未做过java。根据您更新的代码,
SearchRecord
应该从用户处收集搜索参数,并将其返回给调用者(我假设
healthcontracker
)-请参阅以获得更好的解决方案。这样
healthcontracker
就可以称您为“数据库实用程序”类,它包含
populateTable
方法,该方法的值来自
SearchRecord
。职责分离这很好,但是我仍然需要能够从其他类访问该JTable。请参阅此代码,当应用程序首次加载以初始化表时发生,但用户需要能够进行筛选因此,我创建了一个过滤器按钮,显示另一个窗口(SearchRecord.java类),用户可以在其中输入参数,然后单击find单击按钮,然后我运行查询,应该用新结果重新加载表。也许我的方法不对?那么?为什么不能在需要时加载正在执行查询的类的另一个实例?但是,您可以利用
JTable
s内置的筛选支持,有关更多详细信息,请参阅我想我是这样的做得不对,因为我不能让我刚才添加的代码正常工作。很抱歉我的无知,但这是我第一个关于java的项目。我以前从未做过java。根据您更新的代码,
SearchRecord
应该从用户处收集搜索参数,并将其返回给调用者(我假设
HealthTracker
)-请参阅以获得更好的解决方案。这将允许
HealthTracker
调用您的“数据库实用程序”类,该类包含
populateTable
方法,其值来自
SearchRecord
。职责分离