Панель изображений не перекрашивается, кроме системных событий - PullRequest
0 голосов
/ 01 декабря 2009

Мой друг попросил меня помочь ему с Swing, и я дошел до того, что не могу решить проблему. Итак, сначала у меня есть ImagePanel

public class ImagePanel extends JPanel {

  private Image img;

  public void setImage(String img) {
    setImage(new ImageIcon(img).getImage());
  }

  public void setImage(Image img) {
    int width = this.getWidth();
    int height = (int) (((double) img.getHeight(null) / img.getWidth(null)) * width);
    this.img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
  }

  @Override
  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }
}

И FileChooser, который должен открыть выбранное изображение в ImagePanel. Он просто вызывает setImage из ImagePanel. Но изображение не нарисовано. Нет комбинаций повторной печати, проверки и аннулирования справки.

Однако изображение отображается при изменении размера JFrame (с помощью мыши). Итак, вопрос в том, какой метод вызывается при изменении размера (с помощью мыши), что делает перерисовку ImagePanel успешной.

Ответы [ 3 ]

3 голосов
/ 02 декабря 2009

IconImage использует MediaTracker для асинхронной загрузки изображения. В тот момент, когда вы звоните перерисовать, сделать недействительным и т. Д., Изображение не загрузилось.

В вашем компоненте краски замените

    g.drawImage(img, 0, 0, null);

с

    g.drawImage(img, 0, 0, this);  

Класс Component имеет реализацию ImageObserver, которая будет вызывать перекрашивание после завершения загрузки изображения.

1 голос
/ 02 декабря 2009

Установка изображения и его рисование в том виде, в котором вы находитесь в вашем коде, не изменяет фактический размер компонента. В зависимости от компоновки и настройки содержащего фрейма может происходить несколько разных вещей: изначально ваша ImagePanel может иметь размер 0x0 и поэтому не будет отображаться, пока вы не увеличите фрейм, и для ImagePanel не будет выделено больше места; или ImagePanel вручную настраивается на большой размер, который не укладывается в начальный размер JFrame, в этом случае ImagePanel может не отображаться, пока не будет доступен достаточный размер после изменения размера.

0 голосов
/ 01 декабря 2009

Вызов метода перекраски (ссылка на документацию) приведет к перекрашиванию панели. Это приводит к базовому вызову рисования, что также заставляет JPanel рисовать при изменении его размера.

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