Java Swing - поместить изображение в JLabel на / выше второго JLabel (карта, индикатор игрока) - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть окно JFrame с GridBagLayout ().Есть JLabel с Icon - это карта.Теперь мне нужно показать еще одну картинку (индикатор положения игрока) над картой.

Возможно ли это, как?

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

В качестве альтернативы paintComponent() вы также можете посмотреть на OverlayLayout, здесь можно увидеть . По какой-то причине он не включен в галерею , но может быть полезен.

2 голосов
/ 17 ноября 2011

Не удержался, чтобы принять этот вопрос как возможность поиграть с новым jdk7 api: -)

Переопределить paintComponent определенно - это хорошее решение. Тем не менее, он требует создания подклассов, чтобы просто нарисовать что-то в заданном месте поверх чего-то другого. Старым способом сделать это будет JLayeredPane (с которым трудно справиться). Новый jdk имеет компонент JLayer, который позволяет сделать это (и многое другое) простым украшением компонента. Вот фрагмент кода:

  • имеет метку с базовым изображением и украшает ее стандартным JLayer
  • добавляет изображение "player" на стеклянную панель слоя
  • использует DragLayout Роба (установленный на стеклянной панели) для перемещения игрока по голому интерфейсу с двумя ползунками

Рабочий код (отсутствует какая-то внешняя плита котла, у всех вас есть свои шаблоны, чтобы вставить это в:)

  // to please Andrew :)
  JLabel fooLabel = new JLabel(new ImageIcon(ImageIO.read(
          new URL("http://pscode.org/media/stromlo2.jpg"))));

  final JLayer<JLabel> layer = new JLayer<JLabel>(fooLabel);
  final JLabel player = new JLabel(new CursorIcon(30));
  // to please myself (never-ever use a null layout :)
  layer.getGlassPane().setLayout(new DragLayout());
  layer.getGlassPane().add(player);
  layer.getGlassPane().setVisible(true);

  final JSlider horizontal = new JSlider(0, fooLabel.getPreferredSize().width, 0);
  final JSlider vertical = new JSlider(JSlider.VERTICAL, 0, fooLabel.getPreferredSize().height, 0);
  vertical.setInverted(true);
  ChangeListener l = new ChangeListener() {

    @Override
    public void stateChanged(ChangeEvent e) {
        player.setLocation(horizontal.getValue(), vertical.getValue());
        layer.revalidate();
    }
  };
  horizontal.addChangeListener(l);
  vertical.addChangeListener(l);

Быстрый значок:

public static class CursorIcon  implements Icon {

    private int size;

    public CursorIcon(int size) {
        this.size = size;
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        g.setColor(Color.red);
        g.drawLine(size/2,y,size/2,size);
        g.drawLine(x,size/2,size,size/2);
    }

    @Override
    public int getIconWidth() {
        return size;
    }

    @Override
    public int getIconHeight() {
        return size;
    }
}

Для более ранних версий jdk доступен подпроект SwingLabs JXLayer

2 голосов
/ 17 ноября 2011

Подкласс JLabel и переопределение метода рисования.

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // paint player location on map
}

Обработка вашего преобразования из игровых координат в координаты на карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...