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

  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. package jtbpteszt;
  7.  
  8. import java.awt.Dimension;
  9. import java.awt.Graphics;
  10. import java.awt.image.BufferedImage;
  11. import java.io.File;
  12. import java.io.IOException;
  13. import java.net.URL;
  14. import javax.imageio.ImageIO;
  15. import javax.swing.JPanel;
  16.  
  17. /**
  18.  * Egy kép egy ilyen panelre kerül rá.
  19.  *
  20.  * @author rimelek
  21.  */
  22. public class ImagePanel extends JPanel {
  23.    /**
  24.     * A kép
  25.     */
  26.     private BufferedImage image;
  27.  
  28.     /**
  29.      * Panel méretei a kép méreteihez igazítva
  30.      */
  31.     private void init() {
  32.         Dimension d = new Dimension(image.getWidth(),image.getHeight());
  33.         setMinimumSize(d);
  34.         setMaximumSize(d);
  35.     }
  36.  
  37.     /**
  38.      * Kép létrehozása url-ből
  39.      * @param img
  40.      */
  41.     public ImagePanel(URL img) {
  42.        try {
  43.          image = ImageIO.read(img);
  44.        } catch (IOException ex) {
  45.             // handle exception...
  46.        }
  47.            init();
  48.     }
  49.  
  50.     /**
  51.      * Kép létrehozása fájlból
  52.      * @param img
  53.      */
  54.     public ImagePanel(File img) {
  55.         try {
  56.            image = ImageIO.read(img);
  57.         } catch (IOException ex) {
  58.            // handle exception...
  59.         }
  60.         init();
  61.     }
  62.  
  63.     /**
  64.      * Kép kirajzolása
  65.      * @param g
  66.      */
  67.     @Override
  68.     public void paintComponent(Graphics g) {
  69.         g.drawImage(image, 0,0,this); // see javadoc for more info on the parameters
  70.     }
  71.  
  72. }

Main.java

  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. package jtbpteszt;
  7.  
  8. import java.awt.Component;
  9. import java.io.IOException;
  10. import java.net.MalformedURLException;
  11. import java.net.URL;
  12. import javax.swing.BoxLayout;
  13. import javax.swing.JFrame;
  14. import javax.swing.JLabel;
  15. import javax.swing.JPanel;
  16. import javax.swing.JTabbedPane;
  17.  
  18. /**
  19.  *
  20.  * @author rimelek
  21.  */
  22. public class Main {
  23.  
  24.     /**
  25.      * @param args the command line arguments
  26.      */
  27.     public static void main(String[] args) throws MalformedURLException, IOException {
  28.         //ablak létrehozása
  29.         JFrame f = new JFrame("Képek");
  30.         //Az ablak bezárásával álljon le  aprogram is
  31.         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32.  
  33.         //Két fülhöz egy-egy panel
  34.         JPanel p1 = new JPanel();
  35.         JPanel p2 = new JPanel();
  36.  
  37.         //A panelek tartalma egymás alá kerüljön
  38.         p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));
  39.         p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));
  40.  
  41.         //Kép és leírás létrehozása
  42.         JLabel l1 = new JLabel("Ez itt egy szupernova");
  43.         ImagePanel img1 = new ImagePanel(new URL("http://blogs.sun.com/vihang/resource/Supernova.jpg"));
  44.  
  45.         JLabel l2 = new JLabel("Ez itt egy csésze");
  46.         ImagePanel img2 = new ImagePanel(new URL("http://java.sun.com/docs/books/tutorialNB/blog/cupExample/final-cup.png"));
  47.  
  48.         //Középre helyezés
  49.         l1.setAlignmentX(Component.CENTER_ALIGNMENT);
  50.         img1.setAlignmentX(Component.CENTER_ALIGNMENT);
  51.  
  52.         l2.setAlignmentX(Component.CENTER_ALIGNMENT);
  53.         img2.setAlignmentX(Component.CENTER_ALIGNMENT);
  54.  
  55.         //képek és leírások hozzáadása a panelekhez
  56.         p1.add(l1);
  57.         p1.add(img1);
  58.  
  59.         p2.add(l2);
  60.         p2.add(img2);
  61.  
  62.         //Füles panel létrehozása
  63.         JTabbedPane jtbp = new JTabbedPane();
  64.  
  65.         //Fülek hozzáadása
  66.         jtbp.addTab("Szupernova", p1);
  67.         jtbp.addTab("Csésze", p2);
  68.  
  69.         //JTabbedPane hozzáadása az ablakhoz
  70.         f.add(jtbp);
  71.  
  72.         //Méret beállítás és megjelenítés
  73.         f.setSize(600, 600);
  74.         f.setVisible(true);
  75.     }
  76.  
  77. }

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

Új hozzászólás