旋转Swing JLabel

时间:2009-03-06 23:59:15

标签: java swing jlabel

我目前正在尝试实现一个Swing组件,继承自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的高度相同,这不是我的想法。

任何想法如何以正确的方式解决?是否鼓励将渲染委托给超类?

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

我不知道它现在是否相关, 但是在搜索同样的事情时,我在网络上发现了一个非常好的实现, http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html

检查一下,它是一个带有垂直文本的TabbedPane实现, 看看它是否符合您的目的。

答案 2 :(得分:2)

我玩过这个游戏,最初效果不佳,因为标签边界正好是正方形,导致标签右侧的组件移位并变得模糊不清。但我后来意识到这是因为我正在使用JGoodies FormLayout。如果使用此布局管理器,请确保将列大小设置为“首选”而不是“默认”。 HTH。

答案 3 :(得分:0)

我认为它是关闭的,因为你正在翻译错误的观点。

对象的大小取决于你拥有的容器,所以虽然你想要的首选大小可能是你想要的,但实际大小不是吗?

如果您在BorderLayout的CENTER中有此标签,则大小始终为容器的完整大小(减去北+南高,减去东+西宽)

所以你不必翻译实际尺寸,而不是首选尺寸吗?