Kuix 가 Widget 의 크기 를 어떻게 확정 하 는 지 에 대한 연구

Kuix 작가 의 디자인 이념 의 영향 을 받 아 모든 widget 폭 은 자동 으로 증가 합 니 다. 화면 폭 을 초과 하지 않 는 한 실제 적 으로 이런 방법 은 일반 디자인 에서 컨트롤 폭 을 설정 하 는 모델 과 어 울 리 지 않 고 자주 입력 상자 (textfield) 가 화면 경 계 를 초과 하 는 악성 효과 가 나타 날 수 있 습 니 다. 본 고 는 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 속성 을 증가 하 며 속성 이 할당 되 었 을 때 강제로 크기 를 고정 시 키 고 계승 에 대한 맞 춤 형 컨트롤 을 사용 하 는 것 이 좋 습 니 다.

좋은 웹페이지 즐겨찾기