我目前正在尝试实现一个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
......这不是我想到的.
任何想法如何以适当的方式解决?是否鼓励将渲染委托给超类?
我现在在一位同事的帮助下完成了工作.基本上我现在有一个字段,指示是否交换高度/宽度,该高度/宽度仅在原始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; }