简体   繁体   中英

Updating a JTable from query

Currently I have a DerbyDB and a UI with a JTable on it. Now I also I have a bunch of classes but the ones I need help with is SensorDBConnection and myUI . myUI is where have my JTable, and what I want to do is update my JTable from my query which is located on my SensorDBConnection

The following is a snippet from my SensorDBConnection which works because it is doing 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();

So essentially what I am doing right now is querying my data, and then trying to Push it to my JTabel located on my other class, and I don't know how to create the link between them..

Start by separating your UI from you data management. Instead of having SensorDBConnection return a TableModel , have it return the data that would be required to build a data model...

For example...

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;
    }
}

Then, in MyUI , you would simply request the sensor data and build your TableModel . To make your life simpler, create a custom TableModel which knows how to deal with Sensor s...

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;
    }
}

Then simply call the loadData method from SensorDBConnection in your MyUI class and simply create an instance of the TableModel and apply it to the JTable` instance you already have...

 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);
     }
 }

For example...

If I understood your question correctly, you should be able to create an instance of SensorDBConnection in myUI. That way you may call the methods, queries, etc ... of SensorDBConnection within myUI.

I would create my own subclass of TableModel that is specific to the data being returned. Then once you set the data in the TableModel to the new data, call fireTableDataChanged().

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM