Layout BlackBerry 6/7表格布局,带有ColSpan-数字选择小部件
尝试为BlackBerry 6/7制作一个简单的数字点击控件,如下所示: 本质上,它只是一个文本字段和两个按钮,由一个管理器将它们隔开 我知道不支持的加载项TableManager,但它不支持列扫描。而且,我发现使用深度嵌套的管理器的概念。。。令人不安 而且,这会出现多次,所以我想要一个简单的、可重用的组件 因此,我构建了一个简单的管理器来包含这三个组件,甚至允许您出于风格原因提供自己的文本字段或按钮。代码附在下面。显然比需要的更华丽,但工作都是在次级布局中完成的 实际发生的情况是,3个组件的右上角显示在正确的位置,但3个组件“收缩包装”到显示其内容所需的最小尺寸,忽略所请求的“全部使用”宽度和“全部使用”高度。这可能是一个小错误,但如何使这些组件实际使用所有宽度和高度?我尝试了几种不同的用法,但还没有找到一种。当然,任何其他改进也将受到欢迎 谢谢Layout BlackBerry 6/7表格布局,带有ColSpan-数字选择小部件,layout,blackberry,Layout,Blackberry,尝试为BlackBerry 6/7制作一个简单的数字点击控件,如下所示: 本质上,它只是一个文本字段和两个按钮,由一个管理器将它们隔开 我知道不支持的加载项TableManager,但它不支持列扫描。而且,我发现使用深度嵌套的管理器的概念。。。令人不安 而且,这会出现多次,所以我想要一个简单的、可重用的组件 因此,我构建了一个简单的管理器来包含这三个组件,甚至允许您出于风格原因提供自己的文本字段或按钮。代码附在下面。显然比需要的更华丽,但工作都是在次级布局中完成的 实际发生的情况是,3个组件的
package layout;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.EditField;
/**
* XXX BROKEN DO NOT USE YET - layout fail, components get shrink-wrapped.
*
* NumberClicker Makes a layout with three components, like this:
* <pre>
* +-------------------+ +-------------------+
* | | | + |
* | 3 | |-------------------|
* | | |-------------------|
* | | | - |
* |-------------------| |-------------------|
* </pre>
* Note that by default, the buttons are set to increment and decrement the number in the textfield!
* @author Ian Darwin
*/
public class NumberClicker extends Manager {
private static final long SUBCOMPONENT_STYLE = Field.USE_ALL_HEIGHT | Field.USE_ALL_WIDTH;
private static final long MANAGER_STYLE = Field.FIELD_HCENTER | Field.FIELD_VCENTER;
final XYEdges MARGINS = new XYEdges(10,10,10,10);
EditField number = new EditField(SUBCOMPONENT_STYLE);
ButtonField plus = new ButtonField("+", SUBCOMPONENT_STYLE);
ButtonField minus = new ButtonField("-", SUBCOMPONENT_STYLE);
public NumberClicker() {
this(MANAGER_STYLE);
}
public NumberClicker(long style)
{
this(null, null, null, style);
}
/** Constructor allows you to provide your own three fields */
public NumberClicker(EditField number, ButtonField plus, ButtonField minus) {
this(number, plus, minus, MANAGER_STYLE);
}
/** Constructor allows you to provide your own three fields ANd override style.
* If any of the fields is null, the default value is used.
*/
public NumberClicker(EditField number, ButtonField plus, ButtonField minus, long style) {
super(style);
if (number != null) {
this.number = number;
} else {
this.number.setMargin(MARGINS); // set margins on our default, constructed above.
}
setValue(1);
add(this.number); // Nulls allowed, so must be careful to use "this." throughout this method.
if (plus != null) {
this.plus = plus;
} else {
this.plus.setMargin(MARGINS);
}
add(this.plus);
if (minus != null) {
this.minus = minus;
} else {
this.minus.setMargin(MARGINS);
}
add(this.minus);
this.plus.setRunnable(new Runnable() {
public void run() {
increment();
}
});
this.minus.setRunnable(new Runnable() {
public void run() {
decrement();
}
});
}
public void increment() {
number.setText(Integer.toString(Integer.parseInt(number.getText().trim()) + 1));
}
public void decrement() {
number.setText(Integer.toString(Integer.parseInt(number.getText().trim()) - 1));
}
/** Return the integer value of the clicker. Do not call if you are re-using this as a three-component layout manager! */
public int getValue() {
return Integer.parseInt(number.getText().trim());
}
public void setValue(int value) {
number.setText(Integer.toString(value));
}
/**
* Compute sizes and positions of subfields.
*
* Required by Manager
*/
public void sublayout(int width, int height) {
int layoutWidth = width;
int layoutHeight = Math.min(height, Display.getHeight()); // no scrolling here
System.err.println("Display:" + Display.getWidth() + "x" + Display.getHeight());
int halfX = layoutWidth / 2;
int halfY = layoutHeight / 2;
System.err.println("sublayout:" + width + "," + height + "; " + halfX + "," + halfY);
int numberWidth = halfX - number.getMarginLeft() - number.getMarginRight();
int numberHeight = layoutHeight - number.getMarginTop() - number.getMarginBottom();
layoutChild(number, numberWidth, numberHeight);
setPositionChild(number, 0 + number.getMarginLeft(), 0 + number.getMarginTop());
System.err.println(number + " " + numberWidth + "," + numberHeight + " " +number.getMarginLeft());
int plusWidth = halfX - plus.getMarginLeft() - plus.getMarginRight();
int plusHeight = halfY - plus.getMarginTop() - plus.getMarginBottom();
layoutChild(plus, plusWidth, plusHeight);
setPositionChild( plus, halfX + plus.getMarginLeft(), plus.getMarginTop());
int minusWidth = halfX - minus.getMarginLeft() - minus.getMarginRight();
int minusHeight = halfY - minus.getMarginTop() - minus.getMarginBottom();
layoutChild(minus, minusWidth, minusHeight);
// Use plus.getMarginHeight() for better alignment.
setPositionChild( minus, halfX + plus.getMarginLeft(), halfY + minus.getMarginTop() );
//setVirtualExtent(layoutWidth, height);
setExtent(layoutWidth, height);
}
public EditField getNumberField() {
return number;
}
public void setNumberField(EditField number) {
this.number = number;
}
public ButtonField getPlusField() {
return plus;
}
public void setPlusField(ButtonField plus) {
this.plus = plus;
}
public Field getMinusField() {
return minus;
}
public void setMinusField(ButtonField minus) {
this.minus = minus;
}
}
包装布局;
导入net.rim.device.api.system.Display;
导入net.rim.device.api.ui.Field;
导入net.rim.device.api.ui.Manager;
导入net.rim.device.api.ui.XYEdges;
导入net.rim.device.api.ui.component.ButtonField;
导入net.rim.device.api.ui.component.EditField;
/**
*XXX已损坏,尚未使用-布局失败,组件收缩包装。
*
*NumberClicker使用三个组件制作布局,如下所示:
*
* +-------------------+ +-------------------+
* | | | + |
* | 3 | |-------------------|
* | | |-------------------|
* | | | - |
* |-------------------| |-------------------|
*
*请注意,默认情况下,按钮设置为递增和递减文本字段中的数字!
*@作者伊恩·达尔文
*/
公共类NumberClicker扩展管理器{
私有静态最终长子组件_样式=Field.USE_ALL_HEIGHT | Field.USE_ALL_WIDTH;
private static final long MANAGER_STYLE=Field.Field_HCENTER | Field.Field_VCENTER;
最终XYEdges边距=新XYEdges(10,10,10,10);
编辑字段编号=新编辑字段(子组件_样式);
按钮字段plus=新按钮字段(“+”,子组件_样式);
按钮字段减号=新按钮字段(“-”,子组件_样式);
公众号码查询器(){
这种(经理式);
}
公用号码夹(长款)
{
这个(null,null,null,style);
}
/**构造函数允许您提供自己的三个字段*/
public NumberClicker(编辑字段号,按钮字段加号,按钮字段减号){
这(数字、加号、减号、经理样式);
}
/**构造函数允许您提供自己的三个字段和覆盖样式。
*如果任何字段为空,则使用默认值。
*/
public NumberClicker(编辑字段号、按钮字段加号、按钮字段减号、长样式){
超级(风格);
如果(数字!=null){
这个数字=数字;
}否则{
this.number.setMargin(MARGINS);//在上面构造的默认值上设置边距。
}
设定值(1);
add(this.number);//允许为空,因此在整个方法中必须小心使用“this.”。
如果(加上!=null){
this.plus=plus;
}否则{
本.加.设定保证金(保证金);
}
加上(这个加上);
如果(负!=null){
这个。负=负;
}否则{
此.减.setMargin(边距);
}
加(这个减);
this.plus.setRunnable(new Runnable(){
公开募捐{
增量();
}
});
this.减号.setRunnable(new Runnable()){
公开募捐{
减量();
}
});
}
公共空间增量(){
setText(Integer.toString(Integer.parseInt(number.getText().trim())+1));
}
公共无效减量(){
setText(Integer.toString(Integer.parseInt(number.getText().trim())-1));
}
/**返回点击器的整数值。如果将其用作三组件布局管理器,请勿调用*/
public int getValue(){
返回Integer.parseInt(number.getText().trim());
}
公共无效设置值(int值){
number.setText(Integer.toString(value));
}
/**
*计算子字段的大小和位置。
*
*经理要求
*/
公共空隙子布局(整幅宽度、整幅高度){
int layoutWidth=宽度;
int layouthweight=Math.min(height,Display.getHeight());//此处不滚动
System.err.println(“Display:+Display.getWidth()+“x”+Display.getHeight());
int halfX=布局宽度/2;
int-halfY=布局高度/2;
系统错误打印项次(“子布局:“+width+”,“+height+”;“+halfX+”,“+halfY”);
int numberWidth=halfX-number.getMarginLeft()-number.getMarginRight();
int numberHeight=layouthweight-number.getMarginTop()-number.getMarginBottom();
layoutChild(数字、数字宽度、数字宽度);
setPositionChild(数字,0+number.getMarginLeft(),0+number.getMarginTop());
System.err.println(number+“”+numberWidth+,“+numberHeight+“”+number.getMarginLeft());
int plusWidth=halfX-plus.getMarginLeft()-plus.getMarginRight();
int plusHeight=halfY-plus.getMarginTop()-plus.getMarginBottom();
layoutChild(加号、加号、加号);
setPositionChild(plus,halfX+plus.getMarginLeft(),plus.getMarginTop());
int minusWidth=halfX-minus.getMarginLeft()-minus.ge
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.FontMetrics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.EditField;
import net.rim.device.api.ui.decor.Border;
import net.rim.device.api.ui.decor.BorderFactory;
import net.rim.device.api.ui.text.NumericTextFilter;
public class NumberClicker extends Manager {
private class CustomEditField extends EditField {
public int getPreferredWidth() {
FontMetrics fontMetrics = new FontMetrics();
getFont().getMetrics(fontMetrics);
return getMaxSize()*fontMetrics.getMaxCharWidth();
};
public int getPreferredHeight() {
// forcing the field to be single lined
return getFont().getHeight();
}
protected void layout(int width, int height) {
super.layout(
Math.min(width, getPreferredWidth()),
Math.min(height, getPreferredHeight())
);
}
}
final XYEdges MARGINS = new XYEdges(2,2,2,2);
EditField _number;
Manager _numberManager;
ButtonField _plus;
ButtonField _minus;
public NumberClicker() {
super(0);
Font font = getFont();
font = font.derive(Font.BOLD, font.getHeight() + 10);
_number = new CustomEditField();
_number.setFilter(new NumericTextFilter());
_number.setMaxSize(1);
_number.setFont(font);
setValue(1);
_numberManager = new Manager(0) {
protected void sublayout(int width, int height) {
layoutChild(_number, width, height);
setPositionChild(_number,
Math.max(0, (width - _number.getWidth())/2),
Math.max(0, (height - _number.getHeight())/2)
);
setExtent(width, height);
}
};
_numberManager.setBorder(BorderFactory.createRoundedBorder(new XYEdges()));
_numberManager.setMargin(MARGINS);
_numberManager.add(_number);
add(_numberManager);
_plus = new ButtonField("+", 0);
_plus.setMargin(MARGINS);
add(_plus);
_minus = new ButtonField("-");
_minus.setMargin(MARGINS);
add(_minus);
_plus.setRunnable(new Runnable() {
public void run() {
increment();
}
});
_minus.setRunnable(new Runnable() {
public void run() {
decrement();
}
});
}
private void increment() {
synchronized (UiApplication.getEventLock()) { //probably not needed here. overkill.
_number.setText(Integer.toString(Integer.parseInt(_number.getText().trim()) + 1));
}
}
private void decrement() {
if (Integer.parseInt(_number.getText()) <= 0) {
return;
}
synchronized (UiApplication.getEventLock()) { //probably not needed here. overkill.
_number.setText(Integer.toString(Integer.parseInt(_number.getText().trim()) - 1));
}
}
public void setValue(int value) {
if (value < 0) {
return;
}
synchronized (UiApplication.getEventLock()) { // MUST. can be called from non UI thread.
_number.setText(Integer.toString(value));
}
}
/**
* Compute sizes and positions of subfields.
*/
public void sublayout(int width, int height) {
int heightUsed = 0;
int halfX = width / 2;
Border border = _plus.getBorder();
int plusWidth = halfX - _plus.getMarginLeft() - _plus.getMarginRight();
int plusHeight = height - _plus.getMarginTop() - _plus.getMarginBottom();
// calculate horizontal padding so the button will look like USE_ALL_WIDTH
int plusHPadding = (Math.max(0, plusWidth - _plus.getPreferredWidth() - border.getLeft() - border.getRight()))/2;
_plus.setPadding(0, plusHPadding, 0, plusHPadding);
layoutChild(_plus, plusWidth, plusHeight);
setPositionChild( _plus, halfX + _plus.getMarginLeft(), _plus.getMarginTop());
heightUsed += _plus.getHeight() + _plus.getMarginTop() + _plus.getMarginBottom();
border = _minus.getBorder();
int minusWidth = halfX - _minus.getMarginLeft() - _minus.getMarginRight();
int minusHeight = height - _plus.getHeight() - _minus.getMarginTop() - _minus.getMarginBottom();
// calculate horizontal padding so the button will look like USE_ALL_WIDTH
int minusHPadding = (Math.max(0, minusWidth - _minus.getPreferredWidth() - border.getLeft() - border.getRight()))/2;
_minus.setPadding(0, minusHPadding, 0, minusHPadding);
layoutChild(_minus, minusWidth, minusHeight);
setPositionChild( _minus, halfX + _plus.getMarginLeft(), heightUsed + _minus.getMarginTop());
heightUsed += _minus.getHeight() + _minus.getMarginTop() + _minus.getMarginBottom();
int numberWidth = halfX - _numberManager.getMarginLeft() - _numberManager.getMarginRight();
int numberHeight = heightUsed - _numberManager.getMarginTop() - _numberManager.getMarginBottom();
layoutChild(_numberManager, numberWidth, numberHeight);
setPositionChild(_numberManager, _numberManager.getMarginLeft(), _numberManager.getMarginTop());
setExtent(width, heightUsed);
}
}