Vykreslení obrázku v grafickém uživatelském rozhraní v komponentě JScrollPane

Načtení obrázku do rámce v grafickém rozhranní není tak úplně triviální, jak by se mohlo zdát. Problém je, že komponentě nejde říct přímo, jaký obrázek vykreslit. Musí se napsat třída implementující JPanel, vytvořena její instance a přidána jako obsah do nějakého kontejneru, třeba ScrollPane. Takže kroky sou následující:

  1. Vytvořit třídu pro vykreslení, rozšiřující JPanel
  2. Vytvořit referenci na soubor obrázku
  3. Načíst obrázek do paměti
  4. Vytvořit instanci naší třídy
  5. Přiřadit ji do ScrollPane

1) Třída rozšiřující JPanel

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;

public class KresliciPanel extends JPanel
{
  Image img;

  public KresliciPanel (Image img)
  { this.img = img; }

  public void paintComponent (Graphics g) {
   super.paintComponent (g);
   int imgX =0;// obrazek ma rozmer stejny jako ramec
   int imgY =0;// vlozime ho tedy do rohu

   //vykreslime
   g.drawImage (img, imgX, imgY, this);
  }

}

Z kódu je vidět, že třída je opravdu jednoduchá, jak jen to jde.

2) Reference na soubor

File f = new File("obrazek.jpg");

3) Načíst obrázek do paměti

Vytvoříme instanci BufferedImage a pomocí třídy ImageIO ji naplníme obrázkem.

BufferedImage bimage = ImageIO.read(f);

4) Instance naší třídy
Ve třídě gui, nejlépe v metodě volané při nějaké akci, třeba kliknutí na tlačítko, vytvoříme objekt naší třídy

KresliciPanel kp = new KresliciPanel(bimage.getScaledInstance(
JScrollPane.getWidth(), JScrollPane.getHeight(),
Image.SCALE_SMOOTH));

Kde bimage je náš obrázek v paměti, getScaledInstance() vytvoří náhled velký stejně jako je náš zobrazovací panel,a Image.SCALE_SMOOTH je metoda transformace obrázku při zmenšování.

5) Zobrazení obrázku v panelu
Poslední krok, nutný pro vykreslení obrázku v GUI je jeho přiřazení do JscrollPane. Kód je jednoduchý

JScrollPane.add(kp);

Po tomto kroku by již měl být obrázek zobrazen, pokud nenastal problém například s referencí na soubor.

Možná by bylo dobré ještě podotknout kde se veme ten JScrollPane, prostě ho v návrhu rozložení grafiky přetáhneme z panelu komponent na místo kam chceme,a upravíme mu rozměry.

Závěr
Věřím že existuje mnoho lepších praktik, ale když jsem hledal jakoukoli jednoduchou funkční, zabralo to dost času. Tento návod snad poradí do začátku, jak na to.