2011-06-23 33 views
6

对于我为Tapestry做的作业,我必须从表格中显示一串钻石。这是我到目前为止有:如何使用挂毯组件来绘制钻石t:loop

代码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>"; 
    } 

代码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> 

此代码生成的输出:

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

正确我需要的输出是这样的:

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

任何想法都将非常有帮助。

+0

你几乎已经钉上了它, 你唯一错过的就是RowCount - ColCount == number/2部分,请参阅下面的答案。你应该清楚这一点。 – nikhil

+5

我对这两个答案感到非常失望。不是因为内容,而是因为原则......这个问题清楚地表明“这是为了我的家庭作业”,你们没有任何解释就给出了代码。人们不会通过复制/粘贴代码来学习。 – Coeffect

+0

@Mannimarco我做了一个更新,他可以尝试使用outputraw组件来尝试显示为html。前面的信息可以在google或tapestry.org找到 – sfrj

回答

2

想画一个菱形?试试这个算法:

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

等一下,你想创建一个Tapestry页面,绘制的是正确的星号钻石?

一种选择是使用:

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

你只需要设置该字符串的页面的.java部分(见上面的代码进行了更新)

你的输出需要呈现作为html,你可以使用我们给你的算法,插入html代替println()

+0

嗨,感谢您的帮助。我不得不在tml中使用循环和表格组件 – dusmanka

0

这应该打印所需的输出:

public class Diamond 
{ 
    public static void main(String []args) 
    { 
    for(int i=0;i<9;i++){ 
     for(int j=0;j<9;j++) 
     if((i + j == 4) || (i-j == 4)||(i+j == 12) || (j-i == 4)) 
      System.out.print("*"); 
     else 
      System.out.print("-"); 
     System.out.println(); 
    } 
    } 
}