我目前正在尝试实现一个Swing组件,继承JLabel
该组件应该只是代表一个可以垂直定向的标签.
从这开始:
public class RotatedLabel extends JLabel {
public enum Direction {
HORIZONTAL,
VERTICAL_UP,
VERTICAL_DOWN
}
private Direction direction;
Run Code Online (Sandbox Code Playgroud)
我认为改变以下结果是个好主意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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后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);
}
Run Code Online (Sandbox Code Playgroud)
它似乎工作 - 某种程度上 - 文本现在垂直显示.但是,展示位置和尺寸都已关闭.
实际上,背景的宽度(在这种情况下是橙色)与周围的高度是相同的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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16601 次 |
最近记录: |