我使用JDE4.2.1编写了带边框的自定义编辑字段 然后将此字段添加到VerticalLayoutManager并实例化为:
BorderEditField bef = new BorderEditField("Enter a value: ", null, 6,
BorderEditField.FIELD_RIGHT | BorderEditField.FILTER_NUMERIC);
然而,无论我指定哪种样式(FIELD_HCENTER),Field始终保持对齐。 有什么明显的东西我可能会在这里失踪吗?在不同版本的JDE上尝试使用相同的结果......
public class BorderEditField extends BasicEditField {
public BorderEditField(String label, String initialValue, int maxNumChars, long style)
{
super(label, initialValue, maxNumChars, style);
}
private int iRectX = getFont().getAdvance(getLabel());
private int iRectWidth = (getMaxSize() * getFont().getAdvance("X")) + 16;
public int getPreferredWidth() {
return Display.getWidth();
}
public void layout(int width, int height) {
super.layout(width, getPreferredHeight());
setExtent(width, getPreferredHeight());
}
public void paint(Graphics g) {
super.paint(g);
if (isFocus()) {
g.setColor(Color.RED);
g.setGlobalAlpha(220);
g.drawRect(iRectX, 0, iRectWidth, getPreferredHeight());
} else {
g.setColor(Color.BLACK);
g.setBackgroundColor(Color.DARKBLUE);
g.setGlobalAlpha(150);
g.drawRect(iRectX, 0, iRectWidth, getPreferredHeight());
}
}
}
感谢。
答案 0 :(得分:2)
当你创建VerticalFieldManager时,你告诉它USE_ALL_WIDTH吗?如果你没有设置那个标志,那么它只会和最宽的组件一样宽,所以无论你为它的孩子设置什么样的样式,它们总是看起来一样。
== UPDATE ==
好的,另外要看的是你的布局和getPreferredWidth方法。在getPreferredWidth中,您将其设置为屏幕的宽度。这意味着它将占用管理器的整个宽度,因此无法定位它。尝试根据内容计算实际宽度。与布局方法相同,您使用完整的可用宽度调用setExtent。这告诉管理器组件应占用整个宽度。一旦正确计算出来,请尝试使用首选宽度。
作为快速测试,在开始尝试计算宽度之前,您可以在其中硬编码值。如果这有所不同,那么您可以开始计算如何正确计算宽度。
答案 1 :(得分:1)
Dave的答案很好,代码现在看起来像这样,字段正确对齐:
public BorderEditField(String label, String initialValue, int maxNumChars, long style) {
super(label, initialValue, maxNumChars, style);
}
private int iRectX = getFont().getAdvance(getLabel());
public int getPreferredWidth() {
return super.getMaxSize() * super.getFont().getAdvance("X");
}
public int getPreferredHeight() {
return super.getPreferredHeight();
}
public void layout(int width, int height) {
width = Math.min( width, getPreferredWidth() );
height = Math.min( height, getPreferredHeight() );
super.layout(width, height);
setExtent(width, height);
}
public void paint(Graphics g) {
super.paint(g);
if (isFocus()) {
g.setColor(Color.RED);
g.drawRect(iRectX, 0, getPreferredWidth() , getPreferredHeight());
} else {
g.setColor(Color.BLACK);
g.drawRect(iRectX, 0, getPreferredWidth() , getPreferredHeight());
}
}