RegisterSearchFAQ UsergroupsLog in
How to set multiple Footer in single Scientific Grid

 
Reply to topic    Citra Technologies Forum Index » Technical Support - Evaluation View previous topic
View next topic

How to set multiple Footer in single Scientific Grid
Author Message
kannan



Joined: 25 Jul 2008
Posts: 3

Post How to set multiple Footer in single Scientific Grid Reply with quote
Dear Friend,

Here i can able to create single footer for Scientific Grid but need know ,How to create multiple Footer in single Scientific Grid as like
as attached image.

footers are highlighted in Green Colour,it dynamically changed as per the rows.kindly provide solution ASAP.



reportbug.jpg
 Description:
 Filesize:  60.14 KB
 Viewed:  213 Time(s)

reportbug.jpg


Wed Mar 18, 2015 9:00 am View user's profile Send private message
support



Joined: 21 Feb 2006
Posts: 1463

Post Reply with quote
Hello,

This can be tricky. I think the program below does what you ask:

Code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableModelEvent;

import com.citra.filter.CustomPopupFilterHeaderModel;
import com.citra.filter.FilterTableHeader;
import com.citra.table.AdvancedJScrollPane;
import com.citra.table.AdvancedJTable;
import com.citra.table.ColumnModelVetoException;
import com.citra.table.FilterTableModel;
import com.citra.table.ListTableMap;
import com.citra.table.ListTableModel;
import com.citra.table.ObjectTableModel;
import com.citra.table.SortTableModel;
import com.citra.table.VetoableTableColumnModel;
import com.citra.table.VetoableTableColumnModelListener;
import com.citra.table.span.AbstractSpanModel;
import com.citra.table.span.CellSpan;
import com.citra.table.styles.Style;

public class FooterSample {
   //define Port class for our data
   class Port {
      String title;
      String port;
      String code;
      Float quant1;
      Float quant2;
      Port(String port, String code, float quant1, float quant2) {
         this.port = port;
         this.code = code;
         this.quant1 = new Float(quant1);
         this.quant2 = new Float(quant2);
      }
   }
   //define PortModel as our datamodel
   class PortModel extends ObjectTableModel {
      PortModel() {
         super(new String[] {"Title", "Port", "Code", "N1", "N2"});
      }
      public Object getValueAt(Object o, int index) {
         Port p = (Port) o;
         switch (index) {
         case 0:
            return p.title;
         case 1:
            return p.port;
         case 2:
            return p.code;
         case 3:
            return p.quant1;
         case 4:
            return p.quant2;
         default:
            return null;
         }
      }
      public Class getColumnClass(int c) {
         switch (c) {
         case 3:
            return Float.class;
         case 4:
            return Float.class;
         default:
            return String.class;
         }
      }
      public void setValueAt(Object o, Object value, int index) {
         Port p = (Port) o;
         switch (index) {
         case 1:
            p.port = value == null ? null : value.toString();
            break;
         case 2:
            p.code = value == null ? null : value.toString();
            break;
         case 3:
            p.quant1 = value == null ? null : new Float(Float.parseFloat(value.toString()));
            break;
         case 4:
            p.quant2 = value == null ? null : new Float(Float.parseFloat(value.toString()));
            break;
         }
      }
   }
   //define a table model that will display footers and make calculations of average values
   class FooterModel extends ListTableMap {
      //define a class used for making the calculations
      class Eval {
         Eval(int totals, Port port) {
            this.totals = totals;
            this.port = port;
         }
         int totals;
         Port port;
      }
      //data row that holds the total average
      Port avg;
      //list of Port data that holds the average per port
      List footerRows = new ArrayList();
      FooterModel(ListTableModel m) {
         super(m);

         avg = new Port("", "", 0, 0);
         avg.title = "Average for month";
         evaluate();
      }
      public void clear() {
         super.clear();
         evaluate();
      }
      public int getRowCount() {
         //the row count is that of our model plus the number of footer rows
         int i = super.getRowCount() + footerRows.size();
         return i;
      }
      public Object getValueAt(int row, int column) {
         //for footer rows, we need to return values from our footerRows list
         int diff = row - super.getRowCount();
         if (diff < 0) {
            return super.getValueAt(row, column);
         }
         else {
            Port p = (Port) footerRows.get(diff);
            return getCellValue(p, column);
         }
      }
      private void evaluate() {
         //this method adds as many footer rows as are needed, and also performs the calculation of averages
         footerRows.clear();
         footerRows.add(avg);
         List ports = evaluateAvgPerPort(3, 4);
         footerRows.addAll(ports);
      }
      private List evaluateAvgPerPort(int startColumn, int endColumn) {
         //evaluates the averages for the columns from startColumn up to endColumn
         int len = super.getRowCount();
         Map avgPerPort = new TreeMap();
         avg.quant1 = new Float(0);
         avg.quant2 = new Float(0);
         for (int row = 0; row < len; row++) {
            String port = getValueAt(row, 1).toString();
            Eval e = (Eval) avgPerPort.get(port);
            if (e == null) {
               e = new Eval(0, new Port(port, "", 0, 0));
               e.port.title = "Average for month per port";
               avgPerPort.put(port, e);
            }
            e.totals++;
            for (int column = startColumn; column <= endColumn; column++) {
               Float f = (Float) getValueAt(row, column);

               if (column == 3) {
                  e.port.quant1 = new Float(f.floatValue() + e.port.quant1.floatValue());
                  avg.quant1 = new Float(f.floatValue() + avg.quant1.floatValue());
               }
               else if (column == 4) {
                  e.port.quant2 = new Float(f.floatValue() + e.port.quant2.floatValue());
                  avg.quant2 = new Float(f.floatValue() + avg.quant2.floatValue());
               }
            }
         }
         avg.quant1 = new Float(avg.quant1.floatValue() / len);
         avg.quant2 = new Float(avg.quant2.floatValue() / len);
         List ports = new ArrayList();
         for (Iterator it = avgPerPort.values().iterator(); it.hasNext(); ) {
            Eval e = (Eval) it.next();
            e.port.quant1 = new Float(e.port.quant1.floatValue() / e.totals);
            e.port.quant2 = new Float(e.port.quant2.floatValue() / e.totals);
            ports.add(e.port);
         }
         return ports;
      }
      public void tableChanged(TableModelEvent e) {
         //when data changes, this method re-evaluates the footer rows
         super.tableChanged(e);
         int oldrows = getRowCount();
         evaluate();
         int newrows = getRowCount();
         int diff = newrows - oldrows;
         int rc = super.getRowCount();
         if (diff <= 0) fireTableRowsUpdated(rc, newrows);
         else fireTableRowsInserted(oldrows, newrows);
      }
   }
   FooterSample() {
      //create the data model
      final ListTableModel model = new PortModel();
      model.addRow(new Port("AEJEA", "AEJADTP", 10, 20));
      model.addRow(new Port("AEJEA", "AEJADTP", 20, 30));
      model.addRow(new Port("AEKLF", "AEKLFTG", 50, 60));
      model.addRow(new Port("AEKLF", "AEKLFTG", 100, 200));
      //create filter and sort table models (if needed)
      FilterTableModel ftm = new FilterTableModel(model);
      final SortTableModel stm = new SortTableModel(ftm);
      //create the footer model
      final FooterModel sum = new FooterModel(stm);
      final AdvancedJTable table = new AdvancedJTable(sum);
      //make the first column that holds the average title not reorderable
      table.setTableHeader(new FilterTableHeader(table.getColumnModel()) {
         protected boolean canMove(int fromIndex, int toIndex) {
            if (fromIndex == 0 || toIndex == 0) return false;
            return super.canMove(fromIndex, toIndex);
         }
      });
      //add a style for painting the footer rows with a yellow background and bold font
      table.getStyleModel().addStyle(new Style() {
         public void apply(Component comp, JTable t, int r, int c) {
            if (r >= stm.getRowCount()) {
               Font f = comp.getFont().deriveFont(Font.BOLD);
               comp.setFont(f);
               comp.setBackground(Color.yellow);
            }
         }
      });
      //span cells for the averages per port
      table.getSpanDrawer().setSpanModel(new AbstractSpanModel() {
         public CellSpan getCellSpanAt(int row, int column) {
            if (column != 0) return null;
            int diff = row - stm.getRowCount() - 1;
            if (diff >= 0) {
               return new CellSpan(row - diff, column, sum.getRowCount() - stm.getRowCount() - 2, 0);
            }
            else return null;
         }
      });
      table.getSpanDrawer().setUseSpan(true);
      //add a custom popup filter header model
      CustomPopupFilterHeaderModel custom = new CustomPopupFilterHeaderModel();
      custom.attachToTable(table);
      custom.setAutoCreateAllFilters(false);
      //remove the filter from the first column
      custom.removeFilterFromColumn(table.getColumnModel().getColumn(0));
      //remove sorting from first column
      stm.setHeader(table.getTableHeader());
      stm.setSortableColumn(0, false);
      //make the first column immovable
      ((VetoableTableColumnModel) table.getColumnModel()).addVetoableColumnModelListener(new VetoableTableColumnModelListener() {
         public void columnWillBeAdded(TableColumnModelEvent e) throws ColumnModelVetoException {
         }
         public void columnWillBeMoved(TableColumnModelEvent e) throws ColumnModelVetoException {
            if (e.getFromIndex() == 0 || e.getToIndex() == 0) throw new ColumnModelVetoException(e);
         }
         public void columnWillBeRemoved(TableColumnModelEvent e) throws ColumnModelVetoException {
         }
      });
      //enclose table with a scrollpane
      AdvancedJScrollPane scroller = new AdvancedJScrollPane(table);
      //show frame
      JFrame f = new JFrame("Footer Sample");
      f.getContentPane().add(scroller);
      f.pack();
      f.setVisible(true);
   }
   public static void main(String[] args) {
      new FooterSample();
   }
}

Fri Mar 20, 2015 9:24 am View user's profile Send private message
Display posts from previous:    

Reply to topic    Citra Technologies Forum Index » Technical Support - Evaluation All times are GMT - 5 Hours
Page 1 of 1

 
Jump to: 
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You can attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group