É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.
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.
Hozzászólások
ez tetszik! ez jó! ez nekem
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.. =)
Jó tudni, hogy hasznára válik
Jó tudni, hogy hasznára válik valakinek :P
Régi jó kis szerveroldali
Régi jó kis szerveroldali java 1-en volt ilyesmi:D