7

我目前正在尝试实现一个 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

4 回答 4

9

在一位同事的帮助下,我现在可以使用它了。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;
}
于 2009-03-09T12:54:57.680 回答
2

我现在不知道它是否相关,但是在搜索相同的东西时,我在网络上找到了一个非常好的实现, http: //macdevcenter.com/pub/a/mac/2002/03/22/垂直文本.html

检查一下,它是在 TabbedPane 上的一个带有垂直文本的实现,看看它是否适合你的目的。

于 2012-04-05T19:11:09.147 回答
2

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

于 2013-07-04T11:22:58.497 回答
0

我认为它已经关闭,因为您正在翻译错误的观点。

对象的大小取决于您在哪个容器中,所以虽然您的首选大小可能是您想要的,但您的实际大小不是?

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

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

于 2009-03-07T00:45:45.033 回答