目前我正在试图实现一个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;
}
我不知道这是否是相关的现在,但同时寻找同样的事情,我发现在网上,http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html一个很好的实现
检查出来,它是在与垂直文本JTabbedPane的一个实现,看它是否适合你的目的。
我已经受够了这个戏,它不工作得非常好,因为最初的标签边界都是一模一样平方米,造成组件标签的转移,成为模糊的权利。但我后来意识到那是因为我使用的JGoodies的FormLayout。如果您使用此布局管理器,请确保您设置字段大小“首选”而不是“默认”。 HTH。
我认为它是关闭,因为你对翻译错点。
物体的大小取决于你有什么容器这一点,所以当你的首选大小可能是你想要什么,你的实际大小是不是?
如果你有一个BorderLayout的中心这个标签,大小总是容器的全尺寸(减去北向南+高度,减去东+西宽)
所以不要你要翻译一下实际的大小,而不是首选大小?