10

Horizo​​nalFieldManagerが使用されているTextFieldの幅よりも長いテキストを入力すると、左にスクロールするCustomTextFieldを作成しましたが、マウスで右クリックしてスクロールすると、長さが不十分になるという問題があります。しかし、私が入力した最後の単語にとどまりませんここでの問題は何ですか?バグですか

最後の単語に達したときにHorizo​​ntalScrollingを無効にする必要があります単語の最後の単語の最初と最後の間でスクロールできるはずです

コードをチェックしてください

import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.ui.decor.Border;
import net.rim.device.api.ui.decor.BorderFactory;


public class CustomTextField extends VerticalFieldManager {
    private int textWidth=0;
    private int textHeight=0;
    private BasicEditField basicEditField;
    private HorizontalFieldManager hfm;
    //Border border;

    public CustomTextField(int width,int height) {
        super();
        textWidth=width;
        textHeight=height;
        //border=BorderFactory.createSimpleBorder(new XYEdges(1, 1, 1, 1)); 


        hfm=new HorizontalFieldManager(Manager.HORIZONTAL_SCROLL){
            protected void sublayout(int maxWidth, int maxHeight) {
                super.sublayout(maxWidth, maxHeight);
                setExtent(textWidth, textHeight);
            }
        };  
        basicEditField=new BasicEditField("","",200,BasicEditField.NO_NEWLINE);
        //basicEditField.setBorder(border);

        hfm.add(basicEditField);
        add(hfm);
    }


    protected void sublayout(int maxWidth, int maxHeight) {
        super.sublayout(textWidth, textHeight);
        setExtent(textWidth, textHeight);

    }


    protected void paint(Graphics graphics) {
        super.paint(graphics);
        graphics.setColor(Color.BLACK);
        graphics.drawRect(0,0, textWidth, textHeight);
    }

}

私はそれを次のように初期化しました

 CustomTextField textField=new CustomTextField(200, 20);
            add(textField);

私はHorizo​​ntalFieldManagerにScroll(スクロール関数)の必要性を感じています...しかしまだ解決策に到達していません助けてください

4

1 に答える 1

4

したがって、BlackBerry フィールドでは、エクステントはフィールドの実際の視覚的なサイズです。ただし、仮想エクステントは使用できる論理サイズであり、一部は表示されない場合があります。Managersスクロールしたい場合は、通常、仮想範囲を範囲よりも大きく設定します。

この概念を使用してHorizontalFieldManager、テキストをBasicEditField. これを行うには、 を実装して、HorizontalFieldManagerへの変更をリッスンさせる必要がありました。次に、各文字が編集フィールドに入力されると、水平フィールド マネージャーは、現在フィールドにあるテキストの量に必要な幅を再計算します。次に、仮想幅をその幅に再設定します。BasicEditFieldFieldChangeListener

これにより、水平フィールド マネージャーは、入力されたテキストの最後までしかスクロールできず、コードが最初に機能した右方向にはスクロールできなくなります。

したがって、BlackBerry が何か間違ったことをしているとは思いません... OS にバグはありません。以前は、仮想エクステントが設定されていませんでした。

ロジックが約 5 行のコードを超える場合に匿名クラスを使用したくないため、Horizo​​ntalFieldManager を新しいプライベート クラスに分割します。したがって、以下のソリューションは少し異なります。

他の考え:

paint()1) カスタム実装で境界線を描画しようとした結果、描画アーティファクトがあります。しかし、そのバグは元々そこにあり、この質問はスクロールの問題に関するものであると解釈しました。オブジェクトを使用しようとしていたようですBorder。これは、スクロール フィールドの境界を実現するためのおそらくより良い方法です。

2)私の新しいソリューションでは、実際のCustomTextFieldクラスにはあまり含まれていません。の単なるコンテナ ( Manager) ですCustomHorizontalFieldManager。必要に応じて、おそらくその外側の層を取り除くことができます. しかし、コードを投稿するときに、問題を抱えていることにとって重要ではない詳細を削除することがあります。したがって、VerticalFieldManageraHorizontalFieldManagerを含む aBasicEditFieldが必要になる場合があります。それはあなたに任せます...ただし、オプションのcleanupにすぎません。

3) これを 5.0 Storm2 シミュレーターでテストしました。

import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.util.Arrays;

public class CustomTextField extends VerticalFieldManager {

   private int textWidth = 0;
   private int textHeight = 0;
   private CustomHorizontalFieldManager hfm;

   public CustomTextField(int width, int height) {
      super();

      textWidth = width;
      textHeight = height;

      hfm = new CustomHorizontalFieldManager();
      add(hfm);
   }

   protected void sublayout(int maxWidth, int maxHeight) {
      super.sublayout(textWidth, textHeight);
      setExtent(textWidth, textHeight);
   }

   protected void paint(Graphics graphics) {
      // TODO: change me!
      super.paint(graphics);
      graphics.setColor(Color.BLACK);
      graphics.drawRect(0, 0, textWidth, textHeight);
   }

   private class CustomHorizontalFieldManager extends HorizontalFieldManager implements FieldChangeListener {

      private BasicEditField basicEditField;
      /** the maximum virtual width of the edit field, based on the max num of chars */
      private int maxVirtualWidth;

      public CustomHorizontalFieldManager() {
         super(Manager.HORIZONTAL_SCROLL);

         int maxNumChars = 200;
         basicEditField = new BasicEditField("", "", maxNumChars, BasicEditField.NO_NEWLINE);

         // determine how wide the field would need to be to hold 'maxNumChars', with the font
         //   in use ... just pick a long string of all W's, since that's usually the widest char
         char[] buffer = new char[maxNumChars];
         Arrays.fill(buffer, 'W');
         String spacer = new String(buffer);
         maxVirtualWidth = basicEditField.getFont().getAdvance(spacer);

         // we need to listen as the user types in this field, so we can dynamically alter its
         //   virtual width
         basicEditField.setChangeListener(this);

         add(basicEditField);
      }

      protected void sublayout(int maxWidth, int maxHeight) {
         super.sublayout(maxWidth, maxHeight);
         // extent is the visible size, virtual extent can be wider if we want scrolling
         setExtent(textWidth, textHeight);
         setVirtualExtent(maxVirtualWidth, textHeight);
      }

      public void fieldChanged(Field f, int context) {
         if (f == basicEditField) {
            // recalculate how much virtual width the edit field needs, based on the 
            //  current text content
            int newWidth = basicEditField.getFont().getAdvance(basicEditField.getText());
            setVirtualExtent(newWidth, textHeight);
         }
      }
   }

}
于 2012-05-20T09:42:37.947 に答える