Kép beillesztése JTabbedPane-re

JTabbedPane 2. füle

Épp ma kérdezte valaki, hogy hogyan tud képet beilleszteni java-ban JTabbedPane egyik fülére. Nem gyakran használok mostanában Java-t, gondoltam nem lehet olyan nehéz. Utánanéztem. Megkérdeztem egy barátomat is. Keress Google a neve a fickónak. Ikonokról volt leginkább szó és amik nem arról szóltak, azokkal sem nagyon jelent meg a kép, csak pár pixelen. Mint kiderült, egy metódus hívás kellett volna csak, ahol beállítom a méreteket. Készítettem egy példa programot. Mivel a szemléltetési célon kívül értelmetlen a program, futtatható állományt nem mellékelek, csak a forráskódokat.

JTabbedPane 1 füle

Igazából az alap probléma az, hogy képet nem lehet csak úgy hozzáadni egy panelhez. Mert hogy panelhez csak panelt, gombot, label-t stb lehet hozzáadni az add() metóduson keresztül. Viszont ha létrehozunk egy saját panelt, amit örököltetünk a JPanel-ből, akkor saját magára kirajzolhatja a képet. Ehhez felül kell írni a paintComponent metódusát. És ügyelni kell arra, hogy a panel mérete megegyezzen a kép méretével. Se kisebb, se nagyobb ne legyen. Tapasztalatom szerint a setSize() metódus nem elég hozzá. A minimum és maximum méretet külön kell beállítani.

ImagePanel.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package jtbpteszt;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

/**
 * Egy kép egy ilyen panelre kerül rá.
 *
 * @author rimelek
 */

public class ImagePanel extends JPanel {
   /**
    * A kép
    */

    private BufferedImage image;

    /**
     * Panel méretei a kép méreteihez igazítva
     */

    private void init() {
        Dimension d = new Dimension(image.getWidth(),image.getHeight());
        setMinimumSize(d);
        setMaximumSize(d);
    }

    /**
     * Kép létrehozása url-ből
     * @param img
     */

    public ImagePanel(URL img) {
       try {
         image = ImageIO.read(img);
       } catch (IOException ex) {
            // handle exception...
       }
           init();
    }

    /**
     * Kép létrehozása fájlból
     * @param img
     */

    public ImagePanel(File img) {
        try {
           image = ImageIO.read(img);
        } catch (IOException ex) {
           // handle exception...
        }
        init();
    }

    /**
     * Kép kirajzolása
     * @param g
     */

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(image, 0,0,this); // see javadoc for more info on the parameters
    }

}

Main.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package jtbpteszt;

import java.awt.Component;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

/**
 *
 * @author rimelek
 */

public class Main {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) throws MalformedURLException, IOException {
        //ablak létrehozása
        JFrame f = new JFrame("Képek");
        //Az ablak bezárásával álljon le  aprogram is
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Két fülhöz egy-egy panel
        JPanel p1 = new JPanel();
        JPanel p2 = new JPanel();

        //A panelek tartalma egymás alá kerüljön
        p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));
        p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));

        //Kép és leírás létrehozása
        JLabel l1 = new JLabel("Ez itt egy szupernova");
        ImagePanel img1 = new ImagePanel(new URL("http://blogs.sun.com/vihang/resource/Supernova.jpg"));

        JLabel l2 = new JLabel("Ez itt egy csésze");
        ImagePanel img2 = new ImagePanel(new URL("http://java.sun.com/docs/books/tutorialNB/blog/cupExample/final-cup.png"));

        //Középre helyezés
        l1.setAlignmentX(Component.CENTER_ALIGNMENT);
        img1.setAlignmentX(Component.CENTER_ALIGNMENT);

        l2.setAlignmentX(Component.CENTER_ALIGNMENT);
        img2.setAlignmentX(Component.CENTER_ALIGNMENT);

        //képek és leírások hozzáadása a panelekhez
        p1.add(l1);
        p1.add(img1);

        p2.add(l2);
        p2.add(img2);

        //Füles panel létrehozása
        JTabbedPane jtbp = new JTabbedPane();

        //Fülek hozzáadása
        jtbp.addTab("Szupernova", p1);
        jtbp.addTab("Csésze", p2);

        //JTabbedPane hozzáadása az ablakhoz
        f.add(jtbp);

        //Méret beállítás és megjelenítés
        f.setSize(600, 600);
        f.setVisible(true);
    }

}

Természetesen nem csak webről lehet képeket betölteni, hanem saját gépről is. Az ImagePanel osztályban az ahhoz szükséges konstruktor is definiálva van. A File osztály szükséges hozzá. Ami a fájl útvonalát várja paraméterül.

Kategóriák: 
Megosztás/Mentés

Hozzászólások

futa képe

ez tetszik! ez jó! ez nekem hasznos! =)
a diplomamunkám jávában írom majd és kell képeket is belepakolnom.. + a középre igazítást se sikerült eddig megoldanom.. =)

Rimelek képe

Jó tudni, hogy hasznára válik valakinek :P

Zalán képe

Régi jó kis szerveroldali java 1-en volt ilyesmi:D