문제

나는 현재 스윙 구성 요소를 구현하려고 노력하고 있습니다. JLabel 이것은 단순히 수직으로 지향 할 수있는 레이블을 나타내야합니다.

이것으로 시작 :

public class RotatedLabel extends JLabel {

    public enum Direction {
        HORIZONTAL,
        VERTICAL_UP,
        VERTICAL_DOWN
    }

private Direction direction;

결과를 바꾸는 것이 좋은 생각이라고 생각했습니다. getPreferredSize():

@Override
public Dimension getPreferredSize() {
    // swap size for vertical alignments
    switch (getDirection()) {
        case VERTICAL_UP:
        case VERTICAL_DOWN:
            return new Dimension(super.getPreferredSize().height, super
                .getPreferredSize().width);
        default:
            return super.getPreferredSize();
    }
}

그런 다음 간단히 변환합니다 Graphics 원본에 그림을 오프로드하기 전에 개체 JLabel:

@Override
protected void paintComponent(Graphics g) {
    Graphics2D gr = (Graphics2D) g.create();

    switch (getDirection()) {
        case VERTICAL_UP:
            gr.translate(0, getPreferredSize().getHeight());
            gr.transform(AffineTransform.getQuadrantRotateInstance(-1));
            break;
        case VERTICAL_DOWN:
            // TODO
            break;
        default:
    }

    super.paintComponent(gr);
}

텍스트가 이제 수직으로 표시되는 것이 효과가있는 것 같습니다. 그러나 배치와 크기가 꺼져 있습니다.

실제로 배경 너비 (이 경우 주황색)는 주변 높이와 동일합니다. JFrame 그것은 ... 내가 염두에 두었던 것이 아닙니다.

적절한 방법으로 그것을 해결하는 방법이 있습니까? 슈퍼 클래스로 렌더링을 위임하는 것이 권장되고 있습니까?

도움이 되었습니까?

해결책

동료의 약간의 도움으로 지금 일하게되었습니다. 기본적으로 나는 이제 원본이 될 때만 활성화되는 높이/너비를 교환할지 여부를 나타내는 필드가 있습니다. JLabel 그림을 그립니다.

private boolean needsRotate;

@Override
public Dimension getSize() {
  if (!needsRotate) {
    return super.getSize();
  }

  Dimension size = super.getSize();

  switch (getDirection()) {
  case VERTICAL_DOWN:
  case VERTICAL_UP:
      return new Dimension(size.height, size.width);
  default:
    return super.getSize();
  }
}

@Override
public int getHeight() {
  return getSize().height;
}

@Override
public int getWidth() {
  return getSize().width;
}

@Override
protected void paintComponent(Graphics g) {
  Graphics2D gr = (Graphics2D) g.create();

  switch (getDirection()) {
  case VERTICAL_UP:
    gr.translate(0, getSize().getHeight());
    gr.transform(AffineTransform.getQuadrantRotateInstance(-1));
    break;
  case VERTICAL_DOWN:
    gr.transform(AffineTransform.getQuadrantRotateInstance(1));
    gr.translate(0, -getSize().getWidth());
    break;
  default:
  }

  needsRotate = true;
  super.paintComponent(gr);
  needsRotate = false;
}

다른 팁

지금까지 관련이 있는지 모르겠지만 같은 것을 검색하는 동안 웹에서 아주 좋은 구현을 찾았습니다.http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html

확인하십시오. 수직 텍스트가 포함 된 Tabbedpane의 구현입니다. 목적을 확인하십시오.

나는 이것으로 놀이를했는데, 레이블 경계가 정확히 정사각형이었고 레이블 오른쪽에 구성 요소가 이동하고 가려지기 때문에 처음에는 잘 작동하지 않았습니다. 그러나 나는 그것이 jgoodies formlayout을 사용하고 있기 때문이라는 것을 깨달았습니다. 이 레이아웃 관리자를 사용하는 경우 열 크기를 "기본값"이 아닌 "기본"으로 설정하십시오. HTH.

당신이 잘못된 점에 대해 번역하고 있기 때문에 꺼져 있다고 생각합니다.

객체의 크기는 당신이 가지고있는 컨테이너에 따라 다르므로 선호하는 크기가 원하는 것이지만 실제 크기는 그렇지 않습니까?

경계선의 중앙 에이 레이블이있는 경우 크기는 항상 컨테이너의 전체 크기입니다 (마이너스 북쪽+사우스 높이, 마이너스 이스트+서쪽 너비)

따라서 선호하는 크기가 아닌 실제 크기에 대해 번역 할 필요가 없습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top