Kuix 가 Widget 의 크기 를 어떻게 확정 하 는 지 에 대한 연구
widget 은 width 속성 을 가지 고 있 지만 값 을 부여 할 수 없습니다. 이 점 은 TextArea 중국어 단 행 을 수정 할 때 항상 현혹 되 어 있 습 니 다.실제로 Widget 의 width 가 언제 수정 되 었 는 지 직접 찾 는 것 은 어 려 운 일 입 니 다. setBounds 함 수 는 이 효과 가 있 는 것 같 고 공용 입 니 다. 실제로 Desktop 에서 만 호출 되 어 창 이나 시스템 화면의 크기 를 설정 하 는 데 사 용 됩 니 다.실제 모든 컨트롤 의 크기 는 그 안에 포 함 된 하위 컨트롤 의 크기 를 기반 으로 하고 최종 적 으로 Text 의 width 를 기반 으로 합 니 다. 실제 Text 의 width 는 getPreferredSize 에서 계 산 됩 니 다. 호출 순 서 는 새로 고침 이 필요 할 때 layou. dolayot > measure > getPreferredSize 를 실행 합 니 다. 물론 서로 다른 layot 의 구체 적 인 위 치 를 계산 하 는 알고리즘 이 다 릅 니 다.
/* (non-Javadoc)
* @see org.kalmeo.kuix.widget.Widget#getPreferredSize(int)
*/
public Metrics getPreferredSize(int preferredWidth) {
Metrics metrics;
if (needToComputePreferredSize(preferredWidth)) {
metrics = super.getPreferredSize(preferredWidth);
String text = getText();
Font font = getFont();
if (font != null) {
if (text != null) {
metrics.width += font.stringWidth(text);
} else {
metrics.width += font.charWidth(' ');
}
metrics.height += font.getHeight();
}
} else {
metrics = getCachedMetrics();
}
return metrics;
}
어떤 widget 이 크기 를 수정 하거나 widget 을 포함 할 때, 예 를 들 어 text. setText, 실행 순 서 는 다음 과 같 습 니 다 settext > invalidate > parent. invalidate, 단계별 로 invalidate 를 데스크 톱 까지 호출 하고, KuixCanvas. revalidate NextFrame 을 호출 합 니 다. 을 읽 으 면, 이 때 worker 스 레 드 가 forceRevalidate > desktop. revalidate () 를 실행 할 때 까지 기 다 립 니 다.> doLayout 에서 레이아웃 을 다시 계산 하고 forceRepaint 으로 창 을 다시 그립 니 다.
public boolean run() {
if (needToChangeSize) {
forceSizeChanged(desiredWidth, desiredHeight);
}
if (sizeInitialized) {
// Key events, Pointer events and revalidation are execute only if transition is not running
if (!transitionRunning) {
// Key events
if (!keyEvents.isEmpty()) {
synchronized (this) {
for (int i = 0; i < keyEvents.size(); ++i) {
int[] keyEvent = ((int[]) keyEvents.elementAt(i));
FocusManager focusManager = desktop.getCurrentFocusManager();
if (focusManager != null && focusManager.processKeyEvent((byte) keyEvent[0], keyEvent[1])) {
repaintNextFrame();
}
}
}
keyEvents.removeAllElements();
}
// Pointer events
if (!pointerEvents.isEmpty()) {
synchronized (this) {
for (int i = 0; i < pointerEvents.size(); ++i) {
int[] pointerEvent = ((int[]) pointerEvents.elementAt(i));
FocusManager focusManager = desktop.getCurrentFocusManager();
if (focusManager != null && focusManager.processPointerEvent((byte) pointerEvent[0], pointerEvent[1], pointerEvent[2])) {
repaintNextFrame();
} else if ((byte) pointerEvent[0] == KuixConstants.POINTER_DROPPED_EVENT_TYPE) {
if (desktop.getDraggedWidget() != null) {
desktop.removeDraggedWidget(true);
}
}
}
}
pointerEvents.removeAllElements();
}
// Revalidate if needed
if (needToRevalidate) {
forceRevalidate();
}
}
// Repaint
if (needToRepaint) {
forceRepaint();
}
}
return false;
}
};
실제 적 으로 컨트롤 의 고정 폭 을 설정 하려 면 widget 의 바 텀 에서 수정 하고 fixWidth 속성 을 증가 하 며 속성 이 할당 되 었 을 때 강제로 크기 를 고정 시 키 고 계승 에 대한 맞 춤 형 컨트롤 을 사용 하 는 것 이 좋 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.