旋转秋千的JLabel

问题描述 投票:7回答:4

目前我正在试图实现一个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这是高度一致......不完全是我的初衷。

任何想法如何解决,在一个适当的方式?被委托渲染超甚至鼓励?

java swing jlabel
4个回答
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;
}

2
投票

我不知道这是否是相关的现在,但同时寻找同样的事情,我发现在网上,http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html一个很好的实现

检查出来,它是在与垂直文本JTabbedPane的一个实现,看它是否适合你的目的。


2
投票

我已经受够了这个戏,它不工作得非常好,因为最初的标签边界都是一模一样平方米,造成组件标签的转移,成为模糊的权利。但我后来意识到那是因为我使用的JGoodies的FormLayout。如果您使用此布局管理器,请确保您设置字段大小“首选”而不是“默认”。 HTH。


0
投票

我认为它是关闭,因为你对翻译错点。

物体的大小取决于你有什么容器这一点,所以当你的首选大小可能是你想要什么,你的实际大小是不是?

如果你有一个BorderLayout的中心这个标签,大小总是容器的全尺寸(减去北向南+高度,减去东+西宽)

所以不要你要翻译一下实际的大小,而不是首选大小?

© www.soinside.com 2019 - 2024. All rights reserved.