-1

そのため、Blackberry アプリでユーザー資格情報を入力するための 3 つのテキスト編集フィールドを実装しようとしています。ただし、たとえば、ユーザーの名前が editfield ボックスよりも長くなってしまうと問題が発生します (フィールドはボックス内にあり、ボックスは固定されている必要があり、テキストは水平方向にスクロール可能でなければなりません)。

スクロール可能な編集フィールド here に基づいたカスタムのスクロール可能な編集フィールド クラスを次に示します。

import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.EditField;
import net.rim.device.api.ui.container.HorizontalFieldManager;

public class ScrollableEditField extends Manager {
private final static int        DEFAULT_TOP_PADDING     = 1;
private final static int        DEFAULT_BOTTOM_PADDING  = 1;
private final static int        DEFAULT_LEFT_PADDING    = 1;
private final static int        DEFAULT_RIGHT_PADDING   = 1; 

private int                     TOTAL_VERTICAL_PADDING  = DEFAULT_TOP_PADDING + DEFAULT_BOTTOM_PADDING;
private int                     TOTAL_HORIZONTAL_PADDDING = DEFAULT_LEFT_PADDING + DEFAULT_RIGHT_PADDING;

private int                     width  = -1;
private int                     height = -1;

private HorizontalFieldManager  hfm = new HorizontalFieldManager(HORIZONTAL_SCROLL);
private EditField               ef;

public ScrollableEditField(String label, String initialValue, int maxNumChars, long innerEditFieldStyle) {
    super(NO_HORIZONTAL_SCROLL);
    ef = new EditField(label, initialValue, maxNumChars, innerEditFieldStyle);
    hfm.add(ef);
    add(hfm);
}

protected void sublayout(int width, int height) {
    if (this.width != -1) {
        width = this.width;
    }

    if (this.height != -1) {
        height = this.height;
    } else {
        height = ef.getFont().getHeight();
    }

    layoutChild(hfm, width-TOTAL_HORIZONTAL_PADDDING, height-TOTAL_VERTICAL_PADDING);
    setPositionChild(hfm, DEFAULT_LEFT_PADDING, DEFAULT_TOP_PADDING);
    setExtent(width, height); // Maybe not..
}    

public EditField getEditField() {
    return ef;
}

public void setWidth(int width) {
    this.width = width;
}
public void setHeight(int height) {
    this.height = height;
}
protected void onFocus(int direction) {
    super.onFocus(direction);
    ef.setCursorPosition(0);
}

protected void onUnfocus() {
    hfm.setHorizontalScroll(0);
    super.onUnfocus();
}
};

そして、これがコードでこのクラスを使用する方法です。

これらの各フィールドを a に入れ、HorizontalFieldManagerこの hfm をグリッド セル (固定サイズ) 内に配置します。ここにいくつかの行があります:

GridFieldManager gfm = new GridFieldManager(1, 2, 0);
gfm.setColumnProperty(0, GridFieldManager.FIXED_SIZE, Display.getWidth()* 1/5);
gfm.setColumnProperty(1, GridFieldManager.PREFERRED_SIZE_WITH_MAXIMUM,    Display.getWidth()* 4/5);

HorizontalFieldManager hfm1e = new HorizontalFieldManager(USE_ALL_WIDTH|USE_ALL_HEIGHT);

ScrollableEditField sef1 = new ScrollableEditField("", "", 32, EditField.FILTER_EMAIL);
sef1.setWidth((Display.getWidth()* 4/5)-5);
sef1.setHeight(getFont().getHeight());
sef1.setBorder(BorderFactory.createRoundedBorder(new XYEdges(1,1,1,1)));
hfm1e.add(sef1);
gfm2.add(hfm1e);

これらの最後の行は、はるかに大きなクラスからあちこちに取られているだけですが、カスタム編集フィールドを GUI に追加しようとしている方法を示しています。

なんらかの理由で、このコードを実行すると、フィールドがそこにあり、入力できますが、フィールドが 1 文字幅であり、その右側には何も表示されず、フィールドや境界線も表示されません。誰かが私が間違っていることを見つけるのを助けることができますか?

4

1 に答える 1

0

このコードを試してください(冗長なコードをいくつか削除しました)

GridFieldManager gfm = new GridFieldManager(1, 2, 0);
gfm.setColumnProperty(0, GridFieldManager.FIXED_SIZE, Display.getWidth()* 1/5);
gfm.setColumnProperty(1, GridFieldManager.PREFERRED_SIZE_WITH_MAXIMUM, Display.getWidth()* 4/5);

ScrollableEditField sef1 = new ScrollableEditField("", "", 32, EditField.FILTER_EMAIL);
sef1.setBorder(BorderFactory.createRoundedBorder(new XYEdges(1,1,1,1)));
gfm2.add(sef1);

のサイズはsef1、そのマネージャーによって決定されgfmます。したがってhfm1e、、、sef1.setWidth()およびsef2.setWindth()は冗長です。

于 2012-03-30T08:37:53.313 に答える