Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to draw diamond using tapestry component t:loop

For my homework for Tapestry, I have to show a diamond on table from array of strings. Here's what I have so far:

code Index.java

  public class Index
    {
        @Property
        private Integer number;

        @Property
        private String [] table; 

        public Index() {
            number = 9;
            int temp = 0;

            String tmp = "-";
            table = new String[number * number];

            if(singleCell == null)
                singleCell="";

            for (int i = 0; i <  number; i++) {
                for (int j = 0; j <  number; j++) {
                    table[temp] = tmp;
                    temp++;
                }               
            }
        }

        @OnEvent(component="diamond")
        Object onDiamondLink() {
            String swapValue = "*";

            int  sum = number / 2 ;

            int x1 = number-1;

            int sumY = number / 2;

            int y1 = number+1;

            int temp = x1 + sumY;

            for (int i = 0; i < table.length; i++) {
                table[i] = "-";
            }

            for (int i = 0; i < table.length; i++) {
                if( i == sum) {
                    table[i] = swapValue;
                    sum = sum + x1;
                }
                if ( i == sumY ) {
                    table[i] = swapValue;
                    sumY = sumY + y1;
                } 
            }   

            System.out.println("link diamond is activate");
            return null;
        }
 public boolean isStartRow(){
         return (myIndex%9 ==0);
     }

     public boolean isEndRow(){
         return (myIndex%9 == 8);
     }

     public String getStartTR(){
         return "<tr >";
     }

     public String getEndTR(){
         return "</tr>";
    }

code of index.tml:

<t:actionlink t:id="diamond" >Diamond  table</t:actionlink>
            <br/>



         <h1>Result:</h1>

        <table border="1" >
            <t:loop t:source="table" t:value="singleCell" index="MyIndex">
                <t:if test="startRow">
                 <t:outputraw  value="startTR"/>
                </t:if>
                <td width="20px">
                    ${singleCell}
                </td>
            <t:if test="endRow">
                   <t:outputraw value="endTR"/>
           </t:if> 
            </t:loop>
        </table>

This code generates this output:

-   -   -   -   *   -   -   -   -
-   -   -   *   -   *   -   -   -
-   -   *   -   -   -   *   -   -
-   *   -   -   -   -   -   *   -
*   -   -   -   -   -   -   -   *
-   -   -   -   -   -   -   *   -
*   -   -   -   -   -   *   -   -
-   *   -   -   -   *   -   -   -
-   -   *   -   *   -   -   -   -

The correct output I need is this:

-   -   -   -   *   -   -   -   -
-   -   -   *   -   *   -   -   -
-   -   *   -   -   -   *   -   -
-   *   -   -   -   -   -   *   -
*   -   -   -   -   -   -   -   *
-   *   -   -   -   -   -   *   -
-   -   *   -   -   -   *   -   -
-   -   -   *   -   *   -   -   -
-   -   -   -   *   -   -   -   -

Any ideas will be great help.

like image 718
dusmanka Avatar asked Jun 23 '11 16:06

dusmanka


1 Answers

Wanna draw a diamond? Try this algorithm:

public class Diamond {

    @Property
    @Persist
    private String diamond;


    @SetupRender    
    init(){
         int n,i,j,k;

     do {  

      n = (int)(Math.random() * 10 + 3); 

      }while(n % 2 == 0);

      diamond += ""+n+"<br\/>";

      System.out.println();   

     for (i = 1; i <= n; i++){

        for (k = n; k > i; k--)
          diamond += "-";

        for (j =1; j <= i; j++)
             diamond += "*"+"-";


       diamond += "<br\/>";

        }

     for (i = n; i > 0; i--){

        for (k = n; k > i; k--)
          diamond += "-";

        for (j =1; j <= i; j++)
               diamond += "*"+"-";

              diamond += "<br\/>";

        }
}
}

UPDATE

Wait a second, you want to create A tapestry page, that draws that diamond of asterisk right?

One option would be using:

<t:outputraw value="${diamond}"/>

You just need to set that String the .java part of your page.(See the above code was updated)

Your output need to be rendered as html, you can just use the algorithms we gave you and insert html breaks instead of println()

like image 146
javing Avatar answered Oct 14 '22 00:10

javing