Проблема выравнивания настраиваемого поля редактирования для ежевики - PullRequest
1 голос
/ 08 ноября 2010

Я написал пользовательское поле редактирования с рамкой, используя JDE4.2.1. Затем это поле добавляется в VerticalLayoutManager и создается следующим образом:


  BorderEditField bef = new BorderEditField("Enter a value: ", null, 6,
                BorderEditField.FIELD_RIGHT | BorderEditField.FILTER_NUMERIC);

Однако независимо от того, какой стиль яуказать (FIELD_HCENTER) Поле всегда выравнивается по левому краю.Есть ли что-то очевидное, что я мог бы здесь упустить?Пробовал на разных версиях 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());
        }
    }
}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2010

Когда вы создаете VerticalFieldManager, вы говорите ему USE_ALL_WIDTH ?? Если вы не установите этот флаг, он будет иметь ширину не более самого широкого компонента, поэтому независимо от того, какой стиль вы установили для его дочерних элементов, они всегда будут выглядеть одинаково.

== UPDATE ==

Хорошо, еще одна вещь, на которую стоит обратить внимание - это ваш макет и методы getPreferredWidth. В getPreferredWidth вы устанавливаете его на ширину экрана. Это означает, что он займет всю ширину менеджера и поэтому не сможет его позиционировать. Попробуйте рассчитать фактическую ширину на основе содержимого. То же самое с методом макета, вы вызываете setExtent с полной доступной шириной. Это говорит менеджеру, что компонент должен занимать всю ширину. Попробуйте использовать предпочтительную ширину, как только вы рассчитали ее правильно.

В качестве быстрого теста, прежде чем вы начнете пытаться понять, как рассчитать ширину, вы можете просто жестко закодировать значение там. Если это имеет значение, тогда вы можете начать работать с тем, как правильно рассчитать ширину.

1 голос
/ 09 ноября 2010

Хороший ответ от Дейва: теперь код выглядит так, и поле выровнено правильно:

public BorderEditField(String label, String initialValue, int maxNumChars, long style) { super(label, initialValue, maxNumChars, style); }</p> <pre>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()); } }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...