1

LWUIT で固定ヘッダーを持つ特定のテーブルに取り組んでいます。問題に直行させてください。エミュレーターで実行すると、タッチ インターフェイスは非常に正常に動作し、フォームのスクロールは問題なく動作しますが、ナビゲーション キーで移動しようとすると、左キーを押すとグリッチが発生します。問題は、右に移動してから左に戻ると、左のスクロールが 2 列目でフェズし、左のキーを何度押しても左端に移動しないことです。多くの努力を重ねた結果、UP キーと LEFT キーを連続してランダムに押すと、フォームが左端までスクロールする組み合わせを見つけました。なぜこれが起こっているのかわかりません。すべてのエミュレーターと 2 つの実際のハンドセットで試しましたが、それでも同じ問題が発生します。この種の問題を引き起こすコードはありますか? よくわかりません。これに関するヘルプをいただければ幸いです。さらに、ソースコード全体を投稿しているので、興味のある人はそのまま試してみて、この問題がエミュレーターで発生するかどうかを確認できます。

import com.sun.lwuit.Button;
import com.sun.lwuit.Component;
import com.sun.lwuit.Display;
import com.sun.lwuit.Form;
import com.sun.lwuit.Label;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.events.ActionListener;
import com.sun.lwuit.geom.Dimension;
import com.sun.lwuit.layouts.BorderLayout;
import com.sun.lwuit.table.DefaultTableModel;
import com.sun.lwuit.table.Table;
import com.sun.lwuit.table.TableModel;
import javax.microedition.lcdui.Canvas;
import javax.microedition.midlet.MIDlet;

public class FixedTableDemo extends MIDlet implements ActionListener {

private static final String[] TITLES = {"Title 1", "Title 2", "Title 3", "Title 4", "Title 5"};
private static final int ROWS = 100;
private static Dimension[] TITLE_SIZES;
Button b[][];



static class MirroredTable extends Table {

   private MirroredTable mirrorTo;

   public MirroredTable(TableModel m) {

       super(m);

   }



   public MirroredTable(TableModel m, boolean b) {

       super(m, b);

   }

   public void setScrollX(int x) {

       super.setScrollX(x);

       if(isDragActivated()) {
           mirrorTo.setScrollX(x);
       }

   }



   /**

    * @param mirrorTo the mirrorTo to set

    */

   public void setMirrorTo(MirroredTable mirrorTo) {
       this.mirrorTo = mirrorTo;
   }



   public Component createCell(Object value, int row, int column, boolean editable) {

       Component c = super.createCell(value, row, column, editable);

       if(TITLE_SIZES != null && TITLE_SIZES[column] != null) {
           c.setPreferredSize(TITLE_SIZES[column]);
       }

       return c;

   }

}

MirroredTable titlesTable;

MirroredTable bodyTable;

public void startApp() {

   Display.init(this);



   Form f = new Form("Table Title");

   titlesTable = new MirroredTable(new DefaultTableModel(TITLES, new Object[0][0]));

   //TITLE_SIZES = new Dimension[TITLES.length];

   /*for(int iter = 0 ; iter < TITLES.length ; iter++) {
    * 
    * TITLE_SIZES[iter] = titlesTable.createCell(TITLES[iter], -1, iter, false).getPreferredSize();
    * 
    * }*/

   titlesTable.removeAll();

   Button bt[]=new Button[5];

   for(int i=0;i<5;i++)
   {
       bt[i]=new Button("Title  "+i);
       bt[i].setUIID("");
       titlesTable.addComponent(bt[i]);
   }


   Object[][] body = new Object[ROWS][TITLES.length];

   /* for(int rows = 0 ; rows < body.length ; rows++) {
    * 
    * for(int cols = 0 ; cols < body[rows].length ; cols++) {
    * 
    * body[rows][cols] = "" + rows + ", " + cols;
    * 
    * }
    * 
    * }*/

   bodyTable = new MirroredTable(new DefaultTableModel(TITLES, body), false);

   bodyTable.setMirrorTo(titlesTable);

   titlesTable.setMirrorTo(bodyTable);

   bodyTable.setScrollable(true);

   titlesTable.setScrollableX(true);

   f.setScrollable(false);

   f.setLayout(new BorderLayout());

   titlesTable.setTensileDragEnabled(false);

   bodyTable.setTensileDragEnabled(false);

   titlesTable.setIsScrollVisible(false);

   f.addComponent(BorderLayout.NORTH, titlesTable);

   f.addComponent(BorderLayout.CENTER, bodyTable);


   f.addGameKeyListener(Canvas.LEFT, this);
   f.addGameKeyListener(Canvas.RIGHT, this);
   f.addGameKeyListener(Canvas.UP, this);

   f.setCyclicFocus(false);


   /**
    * buttons adding and their listener
    */
   b=new Button[50][5];
   //Label l[][]=new Label[50][5];

   for(int i=0;i<50;i++)
     {
     for(int j=0; j<5;j++)
     {
     b[i][j]=new Button("Title "+i);
     b[i][j].setUIID("");
     //l[i][j]=new Label("Title 1");
     bodyTable.addComponent(b[i][j]);

     }
     }





   f.show();

 }

 public void actionPerformed(ActionEvent evt) {
    if(evt.getKeyEvent()==Canvas.LEFT)
    {
        System.out.println(bodyTable.getScrollX());
        titlesTable.setScrollX(bodyTable.getScrollX());

    }
    else if(evt.getKeyEvent()==Canvas.RIGHT)
    {
        System.out.println(bodyTable.getScrollX());
        titlesTable.setScrollX(bodyTable.getScrollX());
    }
    else if(evt.getKeyEvent()==Canvas.UP)
    {
        System.out.println("Up:"+bodyTable.getScrollX()+","+bodyTable.getScrollY());
    }
 }

 public void pauseApp() {

 }



 public void destroyApp(boolean unconditional) {

 }

}
4

1 に答える 1