我目前正在尝试实现一个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
的高度相同,这不是我的想法。
任何想法如何以正确的方式解决?是否鼓励将渲染委托给超类?
答案 0 :(得分: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;
}
答案 1 :(得分:2)
我不知道它现在是否相关, 但是在搜索同样的事情时,我在网络上发现了一个非常好的实现, http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html
检查一下,它是一个带有垂直文本的TabbedPane实现, 看看它是否符合您的目的。
答案 2 :(得分:2)
我玩过这个游戏,最初效果不佳,因为标签边界正好是正方形,导致标签右侧的组件移位并变得模糊不清。但我后来意识到这是因为我正在使用JGoodies FormLayout。如果使用此布局管理器,请确保将列大小设置为“首选”而不是“默认”。 HTH。
答案 3 :(得分:0)
我认为它是关闭的,因为你正在翻译错误的观点。
对象的大小取决于你拥有的容器,所以虽然你想要的首选大小可能是你想要的,但实际大小不是吗?
如果您在BorderLayout的CENTER中有此标签,则大小始终为容器的完整大小(减去北+南高,减去东+西宽)
所以你不必翻译实际尺寸,而不是首选尺寸吗?