栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JTable,TableModel等的复杂用法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JTable,TableModel等的复杂用法

我知道我的第一个实现方式并不适合我的要求。首先,使用DefaultTableModel是一个很大的限制,
因为您只能使用Vector,Object,String …就我而言,我想通过jtable操纵一组Vehicles。因此,第一件事:

Vehicle.java

public class Vehicle {    enum TipoVeicolo {        AUTO, FURGONE,        AUTOCARRO,        AUTOARTICOLATO    };    private String targa;    private TipoVeicolo tipoVeicolo;    private String marca;    private Stato stato    private float ptt;    //... others...    // constructor    public Vehicle(String targa, TipoVeicolo tipoVeicolo, String marca, Stato stato, float ptt) {        this.targa=targa;        this.tipoVeicolo=tipoVeicolo;        // ... bla bla    }    // GET and SET methods...    //...}

Now, I had already done this. The new is the class that extends
AbstractTableModel (and not DefaultTableModel)

VehicleTableModel.java

public class VehicleTableModel extends AbstractTableModel {    // private objects    private ArrayList<Vehicle> vehicles;    private COLUMNS[] header;    // possible column names:    public enum COLUMNS {        IMAGE_COLUMN,        TARGA_COLUMN,        CAR_TYPE_COLUMN,        //...    }; // if I want I can add others...    ///////////////////////////////////////////////////////    // Constructor:    public VehicleTableModel(COLUMNS[] headerTable) {        this.vehicles = new ArrayList<Vehicle>()        this.header = headerTable;    }    ///////////////////////////////////////////////////////    // obligatory override methods (from AbstractTableModel):    @Override    public int getColumnCount() {        return header.length;    }    @Override    public int getRowCount() {        return vehicles.size();    }    // this works! :D    @Override    public Object getValueAt(int row, int col) {        Object value = "?";        Vehicle v = vehicles.get(row);        if (v!=null) { COLUMNS column = header[col]; switch (column) {     case IMAGE_COLUMN:         int i = findColumn(COLUMNS.CAR_TYPE_COLUMN); // find the right column index         Object tipo = getValueAt(row, i);          value = (ImageIcon)findImageByColumnCarType(tipo); // find the right icon for the type of vehicle.         break;     case TARGA_COLUMN:         value = v.getTarga();         break;     case CAR_TYPE_COLUMN:         value = v.getTipoVeicolo();         break;     //... }        }        return value;    }    ///////////////////////////////////////////////////////    // My methods:    public void addRow(Vehicle vehicle) {        if (!vehicles.contains(vehicle)){ vehicles.add(vehicle); fireTableRowsInserted(0, getRowCount()); // I'm not so sure of this..    }        public void removeRow(int row) {        vehicles.remove(row);        fireTableRowsDeleted(row, row);    }    public Vehicle getVehicleAt(int row) {        return vehicles.get(row);    }    // found the corresponding column index    public int findColumn(COLUMNS columnName) {        for (int i=0; i<getColumnCount(); i++) if (columnName.equals(header[i]))      return i;        return -1;    }    // found the right image    protected static ImageIcon findImageByColumnCarType(Object value) {        ImageIcon i = null;        if (value.equals(TipoVeicolo.AUTO)) i = new ImageIcon(VehicleTableModel.class.getResource("/images/Car-icon_32.png"));        else if (value.equals(TipoVeicolo.AUTOARTICOLATO)) i = new ImageIcon(VehicleTableModel.class.getResource("/images/City-Truck-blue-icon_32.png"));        //...        return i;    }    // knows if exist a value (of a column) in all rows    private boolean controllIfExist(Object value, int col) {        boolean bool = false;        for (int i=0; i<getRowCount();i++){ if (value.equals(getValueAt(i, col))){     bool=true;     break; }        }        return bool;    }    ///////////////////////////////////////////////////////    // other methods (from AbstractTableModel) to ovveride:    // this works! :D    @Override    public Class<?> getColumnClass(int col) {        Class<?> c;        COLUMNS column = header[col];        if (column.equals(COLUMNS.IMAGE_COLUMN)) c = ImageIcon.class;        else if (column.equals(COLUMNS.CAR_TYPE_COLUMN)) c =  JComboBox.class;        // else if blabla....        else c = super.getColumnClass(col);        return c;    }    // this works! :D     @Override    public String getColumnName(int col) {        COLUMNS column = header[col];        if (column.equals(COLUMNS.IMAGE_COLUMN)) return " ";        else if (column.equals(COLUMNS.TARGA_COLUMN)) return "Targa";        else if (column.equals(COLUMNS.CAR_TYPE_COLUMN)) return "Tipo veicolo";        // else if blabla...        return super.getColumnName(col);    };    @Override    public boolean isCellEditable(int row, int col) {        return true;    }    @Override    public void setValueAt(Object value, int row, int col) {        Vehicle v = vehicles.get(row);        boolean flag = false;        if (v!=null) { COLUMNS column = header[col]; switch (column) {     case TARGA_COLUMN:         if (!v.getTarga().equals(value)){  if (!controllIfExist(value, col)){      v.setTarga((String) value);      flag = true;  }         }         break;     case CAR_TYPE_COLUMN:         if (!v.getTipoVeicolo().equals(value)){  v.setTipoVeicolo((TipoVeicolo) value);  flag = true;         }         break;     // other cases bla bla... } if (flag) // update only if have found modify     fireTableRowsUpdated(0, getRowCount()); // or fireTableRowsUpdated(row, row); ?        }    }}

After this, for commodity, I create a VehicleTable (extends JTable). Can it
look like useless, but is right for my objective… You can see the right
settings for the special cells (cell with JComboBox, for example)

VehicleTable.java

public class VehicleTable extends JTable {public VehicleTable(VehicleTableModel vehicleModel) {    super(vehicleModel);     this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);    this.setColumnSelectionAllowed(false);    this.setCellSelectionEnabled(false);    this.setRowSelectionAllowed(true);    this.setShowHorizontalLines(true);    this.setRowHeight(25);    this.setPreferredScrollableViewportSize(new Dimension(700,150));    this.setFillsViewportHeight(true);    ////////////////////////////////////    // Now I set the columns features:    int flag=-1;    TableColumn column;    // Icon Column:    flag = vehicleModel.findColumn(COLUMNS.IMAGE_COLUMN);    if (flag!=-1){        column = this.getColumnModel().getColumn(flag);        column.setMinWidth(80);        column.setMaxWidth(80);    }    // Targa Column:    flag = vehicleModel.findColumn(COLUMNS.TARGA_COLUMN);    if (flag!=-1){        column = this.getColumnModel().getColumn(flag);        column.setMinWidth(100);        column.setMaxWidth(100);    }    // Tipo veicolo Column    flag = vehicleModel.findColumn(COLUMNS.CAR_TYPE_COLUMN);    if (flag!=-1){        column = this.getColumnModel().getColumn(flag);        column.setCellEditor(new DefaultCellEditor(     new JComboBox<TipoVeicolo>(TipoVeicolo.values())));        column.setMinWidth(150);        column.setMaxWidth(150);    }    //others...}

Finally, we can use this. For example in my GUI

ShipperAgentGUI.java (an extract. I focus on ONE table)

public class ShipperAgentGUI extends Jframe implements ActionListener {    // ... bla bla    private COLUMNS[] parkModelHeader = {COLUMNS.IMAGE_COLUMN, COLUMNS.TARGA_COLUMN,        COLUMNS.CAR_TYPE_COLUMN, COLUMNS.MARCA_COLUMN, COLUMNS.STATE_COLUMN, COLUMNS.PTT_COLUMN };    private VehicleTableModel parkModel = new VehicleTableModel(parkModelHeader);    private VehicleTable parkTable;     private Coordinator parkCoordinator; // long story    protected ShipperAgent shipperAgent; // my agent, my third-part software    // ... bla bla    // Constructor:    ShipperAgentGUI(ShipperAgent agent) {        //... bla bla        // Park Table:        parkTable = new VehicleTable(parkModel);        JScrollPane parkScrollPane = new JScrollPane(parkTable);        pnlTableParkPanel.add(parkScrollPane);        //... bla bla        // Coordinators (Mediator pattern's ispired)        // Long story. Is for coordinating with my agent and others tables in my GUI        parkCoordinator = new Coordinator(shipperAgent, parkModel) { @Override public void notifyAndAddRow(final Vehicle vehicle) {     shipperAgent.newTruck(vehicle.getTarga()); // comunicate with the agent     SwingUtilities.invokeLater(new Runnable() {         @Override         public void run() {  parkModel.addRow(vehicle);         }     }); } @Override public void notifyAndDeleteRow(final int rowIndex) {     final Vehicle v = this.tableModel.getVehicleAt(rowIndex);     // bla bla     shipperAgent.removeTruck(v.getTarga()); // comunicate with the agent     SwingUtilities.invokeLater(new Runnable() {         @Override         public void run() {  //parkModel.removeRow(v);  parkModel.removeRow(rowIndex);         }     }); }@Overridepublic void notifyRowUpdated() {    parkModel.addTableModelListener(new TableModelListener() {        public void tableChanged(TableModelEvent e) { switch (e.getType()) {     case (TableModelEvent.DELETE):         parkTable.repaint();         break;     case (TableModelEvent.UPDATE):         int row = e.getLastRow();         int col = parkModel.getIndexColumn(COLUMNS.STATE_COLUMN);         if (parkModel.getValueAt(row, col).equals(Stato.DISPONIBILE))  addVehicle(availablesCoordinator, parkModel.getVehicleAt(row));         else  //removeVehicle(availablesCoordinator, row); error!  availablesModel.removeRow(parkModel.getVehicleAt(row));         repaint();         break; }        }    });}        };        ArrayList<Vehicle> veicoli = shipperAgent.getVehicles(); // from agent        Iterator<Vehicle> I = veicoli.iterator();        while (I.hasNext()){ addVehicle(parkCoordinator, I.next());        }        //... bla bla    } // end of constructor    // ... others methods...    private void addVehicle(Coordinator coordinator, Vehicle v) {        coordinator.notifyAndAddRow(v);    }    public void removeVehicle(Coordinator coordinator, int index) {        coordinator.notifyAndDeleteRow(index);    }    // ...}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/419490.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号