부모 관리자가 초점을 맞출 때 Listfield 내에서 Labelfield 텍스트를 색상하려면 어떻게해야합니까?
-
13-09-2019 - |
문제
내 목록 필드의 항목이 정복되어야하는지 또는 지금 여부를 기준으로 글꼴 색상을 변경할 수있는 재정의 Labelfield가 있습니다. Labelfield Color Subdued가 훌륭하게 작동합니다. 그러나 Labelfield가 포함 된 행이 Listfield에서 강조 표시되면 라벨 필드 색상이 다르거 나 반전되기를 원합니다.
내 코드는 다음과 같습니다.
public class MyLabelField extends LabelField{
public MyLabelField (String s, long l){
super(s, l);
m_bSubdue = true; // this value does change in implementation but not in this sample
}
protected void paint(Graphics g)
{
if(m_bSubdue && !this.isFocus()){ // this isFocus() trick is not working
int color = 0x00696969; // RGB val
g.setColor(color);
}
super.paint(g);
}
boolean m_bSubdue;
}
이 샘플에서는 MyLabelfield가 회색으로 그려지기를 원하지만 Listfield로드에 포함되면 초점이 초점을 맞추면 Labelfield 페인트를 기본값으로하여 흰색으로 만들어야합니다.
내 코드 테스트를 기반으로, 부모 행에 초점을 맞추면 Labelfield가 초점을 맞추지 않는 것 같습니다. 내 코드의 다른 곳에서 변경이 필요할 수도 있습니다 ...
해결책
Labelfield의 색상을 전환하려면 Paint () 메소드에서 선택되었는지 확인할 수 있습니다. 그러나 그럼에도 우리는 Listfield의 모든 행을 다시 칠해야합니다. 그리고 이것이 문제입니다 : Listfield의 행 선택이 변경 될 때마다 ListfieldCallback.drawrow () 메소드의 두 번만 호출이 있습니다 - 먼저 이전 선택 행 (아직 선택된 상태)과 새 선택된 행 (이미 선택된 상태에있는)의 경우 두 번째가 있습니다. ...
이전 선택한 행 색인을 저장하고 Drawrow ()의 각 호출에 다시 그리워하려고했지만 어떤 이유로 든 Labelfield.paint () 메소드는 트리거되지 않았습니다.
그래서 나는 간단하고 추악한 솔루션 : Schedule Listfield.invalidate () Timertask와 함께 제공됩니다. 100ms의 기간은 충분하고 성능에도 영향을 미치지 않습니다.
Jason Emerick의 코드는 확장 된 Listfield의 안내서로 사용되었습니다.
class LabelListField extends ListField implements ListFieldCallback {
private Vector mValues;
private Vector mRows;
public LabelListField(Vector values) {
super(0);
setRowHeight(70);
setCallback(this);
mValues = values;
fillListWithValues(values);
scheduleInvalidate();
}
private void scheduleInvalidate() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
invalidate();
}
}, 0, 100);
}
private void fillListWithValues(Vector values) {
mRows = new Vector();
for (int i = 0; i < values.size(); i++) {
TableRowManager row = new TableRowManager();
String title = "Item# " + String.valueOf(i + 1);
LabelField titleLabel = new LabelField(title);
titleLabel.setFont(Font.getDefault().derive(Font.BOLD));
row.add(titleLabel);
String value = (String) values.elementAt(i);
ListLabel valueLabel = new ListLabel(this, i, value);
valueLabel.setFont(Font.getDefault().derive(Font.ITALIC));
row.add(valueLabel);
mRows.addElement(row);
}
setSize(mRows.size());
}
private class TableRowManager extends Manager {
public TableRowManager() {
super(0);
}
public void drawRow(Graphics g, int x, int y,
int width, int height) {
layout(width, height);
setPosition(x, y);
g.pushRegion(getExtent());
paintChild(g, getField(0));
paintChild(g, getField(1));
g.popContext();
}
protected void sublayout(int width, int height) {
int fontHeight = Font.getDefault().getHeight();
int preferredWidth = getPreferredWidth();
Field field = getField(0);
layoutChild(field, preferredWidth - 5, fontHeight + 1);
setPositionChild(field, 5, 3);
field = getField(1);
layoutChild(field, preferredWidth - 5, fontHeight + 1);
setPositionChild(field, 5, fontHeight + 6);
setExtent(preferredWidth, getPreferredHeight());
}
public int getPreferredWidth() {
return Display.getWidth();
}
public int getPreferredHeight() {
return getRowHeight();
}
}
public void drawListRow(ListField listField, Graphics g,
int index, int y, int width) {
LabelListField list = (LabelListField) listField;
TableRowManager rowManager = (TableRowManager) list.mRows
.elementAt(index);
rowManager.drawRow(g, 0, y, width, list.getRowHeight());
}
public Object get(ListField list, int index) {
return mValues.elementAt(index);
}
public int indexOfList(ListField list, String prefix, int start) {
for (int x = start; x < mValues.size(); ++x) {
String value = (String) mValues.elementAt(x);
if (value.startsWith(prefix)) {
return x;
}
}
return -1;
}
public int getPreferredWidth(ListField list) {
return Display.getWidth();
}
class ListLabel extends LabelField {
int mIndex = -1;
public ListLabel(LabelListField list, int index, String text) {
super(text);
mIndex = index;
}
protected void paint(Graphics graphics) {
if (getSelectedIndex() == mIndex)
graphics.setColor(Color.RED);
else
graphics.setColor(Color.BLUE);
super.paint(graphics);
}
}
}