我目前正在尝试实现一个 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
我的想法不太一样。
任何想法如何以适当的方式解决这个问题?是否鼓励将渲染委托给超类?