2009-03-06 3 views
7

현재 스윙 구성 요소를 구현하려고하는데, JLabel을 상속받습니다. 스윙 구성 요소는 단순히 수직으로 배치 할 수있는 레이블을 나타내야합니다.스윙 JLabel을 회전하십시오.

public class RotatedLabel extends JLabel { 

    public enum Direction { 
    HORIZONTAL, 
    VERTICAL_UP, 
    VERTICAL_DOWN 
    } 

    private Direction direction; 

나는 그냥 getPreferredSize()의 결과를 바꿀 수있는 좋은 아이디어의 생각 :

이부터 나는에 그림을 오프로드하기 전에 간단하게 Graphics 개체를 변환 한 후

@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(); 
    } 
    } 

과 원본 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); 
    } 
} 

텍스트가 이제는 수직으로 표시된다는 것이 작동하는 것처럼 보입니다. 그러나 배치와 크기가 꺼져 있습니다 :

사실, 배경의 너비 (이 경우 오렌지색)는 주위의 높이와 동일합니다 ... 이는 내가 염두에 두었던 것입니다.

어떤 아이디어를 적절한 방법으로 해결할 수 있습니까? 수퍼 클래스로 렌더링을 위임하는 것이 심지어 권장됩니까?

+0

"("gr.translate0, getPreferredSize(). getHeight()); ' – brownian

답변

8

동료의 도움을 받아 이제 작동하게되었습니다. 기본적으로 나는 원래 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; 
} 
+0

전체 수업을 제공 할 수 있습니까? –

+1

http://hypftier.de/dump/RotatedLabel을 참조하십시오.java - 언급 된 라이센스는 BSD를 모델로 한 꽤 자유주의적인 라이센스입니다 (라이센스 텍스트는 지금까지는 독일어로만 제공됨). – Joey

0

잘못된 지점에 대해 번역 중이기 때문에 사용하지 않았다고 생각합니다.

개체의 크기는이 컨테이너가있는 컨테이너에 따라 달라 지므로 원하는 크기가 원하는 크기 일 수 있지만 실제 크기는 아닙니다. 당신이의 BorderLayout의 중심에이 라벨이있는 경우

는 크기가 항상 용기의 전체 크기 (마이너스 북 + 남쪽 높이 뺀 동쪽 + 서쪽 폭)

그래서 당신은 필요 없어 선호하는 크기가 아닌 실제 크기에 대해 번역 하시겠습니까?

+0

음 ... 안 ... 아주. 레이블의 세로 (현재 가로) 정렬이 가운데에 배치되었으므로 배치가 약간 벗어나지 만 크기는 이제 정확히 정사각형입니다. 수퍼 클래스가 내 재정의 된 getPreferredSize 메서드를 신경 쓰지 않아서 내 경계와 관련하여 자체를 그리지 않을 수 있습니까? – Joey

2

지금에 의해 관련성이 있는지 모르겠다는 는 그러나 같은 일을 검색하는 동안, 나는 웹에 아주 좋은 구현, http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html

가 체크 아웃을 발견, 그것은이다 TabbedPane의 세로 텍스트를 사용한 구현 목적에 적합한가 어떤가를 확인합니다.

2

나는 이걸 가지고 놀았지만 처음에는 라벨 경계가 정확히 사각형이었고 레이블 오른쪽의 구성 요소가 어긋나 어서 가려 졌기 때문에 처음에는 잘 작동하지 않았습니다. 그러나 나는 JGoodies FormLayout을 사용하고 있기 때문에 그 사실을 깨달았습니다. 이 레이아웃 관리자를 사용하는 경우 열 크기를 "기본"이 아닌 "기본 설정"으로 설정해야합니다. HTH.

관련 문제