I've seen a post or two about getting featureclass attributes into a .NET datagrid, now you have a sample for the Java community... which I believe consists of myself and Eric Bader, and maybe two other people.Checking the Java 1.6 API, a JTable can be created in a number of ways, with Object arrays, Vectors or by using a TableModel. This sample is extending an AbstractTableModel.JTable myTable = new JTable(new MyTableModel());
import java.io.IOException; import javax.swing.table.AbstractTableModel; import com.esri.arcgis.carto.FeatureLayer; import com.esri.arcgis.geodatabase.IFeatureClass; import com.esri.arcgis.geodatabase.IFeatureCursor; import com.esri.arcgis.geodatabase.IRow; import com.esri.arcgis.interop.AutomationException; import com.esri.arcgis.system.Cleaner; public class MyTableModel extends AbstractTableModel { private static final long serialVersionUID = whatever value you generate here; public MyTableModel(){ data = createTableModel(); } @Override public int getRowCount() { return data.length; } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return data[rowIndex][columnIndex]; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { data[rowIndex][columnIndex] = (String) aValue; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { // Allow editing on the field named "FIELD THREE" if (columnIndex == 3) { return true; } else { return false; } } private String [][] createTableModel(){ try{ // Get the feature layer being used as the data source to the table model. // Basically, this method takes a String featureclass name, iterates over the TOC to match the name, and returns a FeatureLayer FeatureLayer fl = (FeatureLayer) MapUtility.getLayerByName(MyTableModel.FEATURELAYERNAME); IFeatureClass featureClass = fl.getFeatureClass(); // Passing null as a QueryFilter parameter to search will return all records. // Using a recycling cursor (true) improves performance, but is only intended to read data, which we are doing here. // Row objects returned by a recycling cursor should not be modified, which we're not. // You might even consider not using a featureCursor here at all, if you perform an ITable_search on your featureClass, then you could use a regular ICursor IFeatureCursor featCursor = featureClass.search(null, true); int oidFieldIndex = featureClass.findField(featureClass.getOIDFieldName()); int fieldoneFieldIndex = featureClass.findField("FIELD ONE"); int fieldtwoFieldIndex = featureClass.findField("FIELD TWO"); int fieldthreeFieldIndex = featureClass.findField("FIELD THREE"); // We need to know how big to make the [][] array. int featureCount = featureClass.featureCount(null); // Create a new String[][] with the number of records in your featureclass data = new String [featureCount][]; // Assign values to the data[][] // This gets expensive creating a new String array for every featureclass record int i = 0; IRow row = null; while((row = featCursor.nextFeature()) != null){ oid = row.getValue(oidFieldIndex).toString(); fieldOne = row.getValue(fieldoneFieldIndex).toString(); fieldTwo = row.getValue(fieldtwoFieldIndex).toString(); fieldThree = row.getValue(fieldthreeFieldIndex).toString(); String [] x = {oid, fieldOne, fieldTwo, fieldThree}; data = x; i++; } // If the cursor is no longer needed, release it. Cleaner.release(featCursor); } catch (AutomationException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return data; } private String[][] data; // I'm assuming that your featureclass has all string field types, if so, you might just consider putting the row.getValue method calls in the String [] x array directly. private String oid = null; private String fieldOne= null; private String fieldTwo = null; private String fieldThree = null; // You can use the actual field names, or make up your own alias for the featureclass field names for the JTable column headers private String[] columnNames = {"OID", "Alias for field one", "Alias for field two", "Alias for field three"}; private static final String FEATURELAYERNAME = "Your feature layer name here"; }