Вопрос

В настоящее время я пытаюсь реализовать компонент 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

Проверьте это, это реализация поверх TabbedPane с вертикальным текстом, Посмотрите, подходит ли вам это.

Я поиграл с этим, поначалу он работал не очень хорошо, потому что границы меток были точно квадратными, и компоненты справа от метки сдвигались и становились неясными. Но потом я понял, что это потому, что я использую JGoodies FormLayout. Если вы используете этот менеджер компоновки, убедитесь, что вы установили размер столбца как «предпочитаемый». не "по умолчанию". НТН.

Я думаю, что это не так, потому что вы переводите не в том направлении.

размер объекта зависит от того, в каком контейнере у вас это есть, поэтому, хотя ваш предпочтительный размер может быть тем, что вы хотите, ваш реальный размер не равен?

если у вас есть этот ярлык в ЦЕНТРЕ BorderLayout, размер всегда равен полному размеру контейнера (минус север + высота юга, минус восток + западная ширина)

так что вам не нужно переводить о реальном размере, а не о предпочтительном размере?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top