旋转Swing JLabel

Joe*_*oey 7 java swing jlabel

我目前正在尝试实现一个Swing组件,继承JLabel该组件应该只是代表一个可以垂直定向的标签.

从这开始:

public class RotatedLabel extends JLabel {

    public enum Direction {
        HORIZONTAL,
        VERTICAL_UP,
        VERTICAL_DOWN
    }

private Direction direction;
Run Code Online (Sandbox Code Playgroud)

我认为改变以下结果是个好主意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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后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);
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作 - 某种程度上 - 文本现在垂直显示.但是,展示位置和尺寸都已关闭.

实际上,背景的宽度(在这种情况下是橙色)与周围的高度是相同的JFrame......这不是我想到的.

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

Joe*_*oey 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 请参阅 http://hypftier.de/dump/RotatedLabel.java – 提到的许可证是一个非常自由的许可证,以 BSD 为模型(尽管目前许可证文本仅提供德语版本)。 (2认同)