Как реализовать правильный горизонтальный прокручиваемый пользовательский EditField?
Поэтому мы пытаемся реализовать 3 поля редактирования текста, чтобы люди могли вводить свои учетные данные в нашем приложении Blackberry. Однако у нас возникают проблемы, когда имя пользователя, например, заканчивается дольше, чем поле редактирования (поле должно быть внутри поля, а поле должно оставаться стационарным, текст должен прокручиваться горизонтально).
Вот мой класс прокручиваемого поля редактирования, основанный на прокручиваемом поле редактирования:
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();
}
};
И вот как я использую этот класс в своем коде:
Я поместил каждое из этих полей в 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 ответ
Попробуйте этот код (я удалил лишний код)
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()
избыточны.