【问题标题】:Updating a JTable from query从查询更新 JTable
【发布时间】:2014-04-23 22:55:52
【问题描述】:

目前我有一个 DerbyDB 和一个带有 JTable 的 UI。现在我也有很多课程,但我需要帮助的是SensorDBConnectionmyUImyUI 是我的 JTable 所在的位置,我想做的是从位于我的 SensorDBConnection 上的查询中更新我的 JTable

以下是来自我的SensorDBConnection 的 sn-p,它之所以有效,是因为它正在执行 System.outs

DefaultTableModel model;//Confused
    model = new DefaultTableModel(); //Confused
    jTable1 = new JTable(model);//Confused 

    model.addColumn("TIME");
    model.addColumn("SENSORID");
    model.addColumn("TEMP");
    model.addColumn("HUM");
    model.addColumn("LIGHT");
    model.addColumn("VOLTAGE");

        while(results.next())
        {
            time = results.getInt(1);
            id = results.getInt(2);
            temp = results.getInt(3);
            hum = results.getInt(4);
            light = results.getInt(5);
            voltage = results.getInt(6);
            model.addRow(new Object[]{time,id,temp,hum,light,voltage});
            Sensor sens = new Sensor(id, temp, hum, light, voltage);
            sensors.add(sens);               
            //System.out.println(sens);
        }

        results.close();
        stmt.close();

所以基本上我现在正在做的是查询我的数据,然后尝试将其推送到位于我的其他类上的 JTabel,我不知道如何创建它们之间的链接..

【问题讨论】:

    标签: java swing user-interface jtable derby


    【解决方案1】:

    首先将您的 UI 与数据管理分开。与其让SensorDBConnection 返回TableModel,不如让它返回构建数据模型所需的数据...

    例如...

    public class SensorDBConnection extends ... {
        public List<Sensor> loadData() {
            List<Sensor> sensors = new ArrayList<>(25);
            try {
                //...
                while(results.next())
                {
                    time = results.getInt(1);
                    id = results.getInt(2);
                    temp = results.getInt(3);
                    hum = results.getInt(4);
                    light = results.getInt(5);
                    voltage = results.getInt(6);
                    model.addRow(new Object[]{time,id,temp,hum,light,voltage});
                    Sensor sens = new Sensor(id, temp, hum, light, voltage);
                    sensors.add(sens);               
                }
            } finally {
                try {
                    results.close();
                } catch (Exception exp) {
                }
                try {
                    stmt.close();  
                } catch (Exception exp) {
                }
            }
            return sensors;
        }
    }
    

    然后,在MyUI 中,您只需请求传感器数据并构建您的TableModel。为了让你的生活更简单,创建一个自定义的TableModel,它知道如何处理Sensors...

    public class SensorTableModel extends AbstractTableModel {
    
        protected static final String[] COLUMN_NAMES = {
            "TIME",
            "SENSORID",
            "TEMP",
            "HUM",
            "LIGHT",
            "VOLTAGE"
        };
    
        private List<Sensor> sensors;
    
        public SensorTableModel(List<Sensor> sensors) {
            this.sensors = sensors;
        }
    
        @Override
        public String getColumnName(int column) {
            return COLUMN_NAMES[column];
        }
    
        @Override
        public int getRowCount() {
            return sensors.size();
        }
    
        @Override
        public int getColumnCount() {
            return COLUMN_NAMES.length;
        }
    
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Sensor sensor = sensors.get(rowIndex);
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = sensor.getTime();
                    break;
                case 1:
                    value = sensor.getID();
                    break;
                case 2:
                    value = sensor.getTemp();
                    break;
                case 3:
                    value = sensor.getHum();
                    break;
                case 4:
                    value = sensor.getLight();
                    break;
                case 5:
                    value = sensor.getVoltage();
                    break;
            }
            return value;
        }
    }
    

    然后只需在您的MyUI 类中从SensorDBConnection 调用loadData 方法,然后只需创建一个您已经拥有的TableModel and apply it to theJTable` 实例的实例...

     public class MyUI extends ... {
         private JTable table;
         private SensorDBConnection sensor;
         //...
         protected void loadTableContents() {
             TableModel model = null;
             try {
                model = new SensorTableModel(sensor.loadData());
             } catch (SQLException exp) {
                 // Handle exception
             }
             table.setModel(model);
         }
     }
    

    例如...

    【讨论】:

    • 谢谢!我会试试这个
    【解决方案2】:

    如果我正确理解了您的问题,您应该能够在 myUI 中创建 SensorDBConnection 的实例。这样您就可以在 myUI 中调用 SensorDBConnection 的方法、查询等。

    【讨论】:

    • 好的,让我继续谷歌如何做到这一点。感谢您的回复
    【解决方案3】:

    我将创建自己的 TableModel 子类,该子类特定于返回的数据。然后,将 TableModel 中的数据设置为新数据后,调用 fireTableDataChanged()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多