В настоящее время я пытаюсь реализовать компонент 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
, что ... не совсем то, что я имел в виду.
Есть идеи, как решить это правильно? Делегирование рендеринга суперклассам даже поощряется?