旋转Swing JLabel

我目前正在尝试实现一个Swing组件,inheritance自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(); } } 

然后在我将绘画卸载到原始JLabel之前简单地转换Graphics对象:

  @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的高度相同,这是我的想法。

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

我现在在同事的帮助下开始工作了。 基本上我现在有一个字段,指示是否交换高度/宽度,该高度/宽度仅在原始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; } 

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

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

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

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

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

如果你在BorderLayout的CENTER中有这个标签,那么大小总是容器的整个尺寸(减去北+南高,减东+西宽)

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