[Java] Rysowanie obrazka na JPanel

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
warlock24
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 102
Rejestracja: 20 cze 2008, 22:35
Płeć: Mężczyzna
Wersja Ubuntu: 12.10
Środowisko graficzne: GNOME
Architektura: x86_64

[Java] Rysowanie obrazka na JPanel

Post autor: warlock24 »

Witam,

jestem trochę początkujący w Javie i chyba nie rozwiążę tego problemu do czasu wydania Ubuntu 12 :lol:

mam sobie JPanel, którego chcę przerobić na komponent (fasolkę ?) do wyświetlania obrazków, coś jak TImage z Delphi. Wszystko działa dobrze pod warunkiem że mój panel jest pozycjonowany za pomocą jakiegokolwiek layoutu. Jeżeli na oknie które ma zawierać mój panel nie ma żadnego laya (setLayout(null)) to po prostu nic się nie wyświetla :?

Kod: Zaznacz cały

class MyImage extends JPanel{
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(picture, 0, 0, this);
		System.out.println("działa");
	}
}

//A - obrazek rysowany jest poprawnie
setLayout(new BorderLayout());
image = new MyImage();
add(image, BorderLayout.CENTER);

//B - obrazka ani nawet komponentu nie widać
setLayout(null);
image = new MyImage();
image.setBounds(2, 2, 177, 250);
add(image);

co mógłbym zrobić aby mój komponent był wyświetlany przy pozycjonowaniu bezwzględnym? :ligt:
Awatar użytkownika
mate_haru
Sędziwy Jeż
Sędziwy Jeż
Posty: 47
Rejestracja: 05 paź 2006, 12:42
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: Fluxbox
Architektura: x86_64
Kontakt:

Odp: [Java] Rysowanie obrazka na JPanel

Post autor: mate_haru »

Coz - o ile mi wiadomo, panel musi posiadac jakis layout, bo inaczej nie wie on w jaki sposob ma ustawiac komponenty. Jesli dobrze pamietam, to domyslnym layoutem przy tworzeniu kazdego panelu jest FlowLayout, ktory pozycjonuje kazdy kolejny element w kierunku od lewej do prawej. Jednak tych layoutow udostepnianych przez Swinga jest dosc sporo i wystarczy minimum wysilku, aby zrobic na tworzonym oknie co sie tylko podoba. Taki na przyklad SpringLayout - pozwala na pozycjonowanie kazdego nowego elementu w pewnej odleglosci od innego elementu (lub krawedzi panelu).
Polecam Ci lekture nastepujacych witryn: tutek korzystania z przeroznych layoutow, tutek tworzenia aplikacji opartych na Swingu. Jesli to nie rozwiaze Twojego problemu, to pisz dalej co Ci lezy na watrobie :D

Pozdrawiam,
mh
Awatar użytkownika
Opalo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 07 sty 2009, 09:52
Płeć: Mężczyzna

Odp: [Java] Rysowanie obrazka na JPanel

Post autor: Opalo »

mate_haru pisze:Coz - o ile mi wiadomo, panel musi posiadac jakis layout, bo inaczej nie wie on w jaki sposob ma ustawiac komponenty.
Tak akurat nie jest. Ten kod wyglada na prawidlowy. Moze blad tkwi gdzie indziej.
Awatar użytkownika
warlock24
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 102
Rejestracja: 20 cze 2008, 22:35
Płeć: Mężczyzna
Wersja Ubuntu: 12.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [Java] Rysowanie obrazka na JPanel

Post autor: warlock24 »

mate_haru pisze:Coz - o ile mi wiadomo, panel musi posiadac jakis layout, bo inaczej nie wie on w jaki sposob ma ustawiac komponenty. Jesli dobrze pamietam, to domyslnym layoutem przy tworzeniu kazdego panelu jest FlowLayout...

niestety to nie w tym rzecz :-(

//Sytuacja A
* mam JDialog
* mam kupę innych kontrolek
* mam własny komponent dziedziczący z JPanel wyświetlający obrazek

dalej
* ustawiam w JDialog layout null
* dodaję do niego wszystkie kontrolki

wynik
wszystkie kontrolki wyświetlane są prawidłowo... oprócz mojego komponentu wyświatlajacego obrazek :wall:


//Sytuacja B
* mam JDialog
* mam kupę innych kontrolek
* mam własny komponent dziedziczący z JPanel wyświetlający obrazek

dalej
* ustawiam w JDialog layout na jakikolwiek
* dodaję do niego wszystkie kontrolki

wynik
wszystkie kontrolki wyświetlane są prawidłowo, równierz moja kontrolka z obrazkiem
Awatar użytkownika
Opalo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 07 sty 2009, 09:52
Płeć: Mężczyzna

Odp: [Java] Rysowanie obrazka na JPanel

Post autor: Opalo »

warlock24 pisze: wszystkie kontrolki wyświetlane są prawidłowo... oprócz mojego komponentu wyświatlajacego obrazek
Z tego co pamietam dla kazdej kontrolki trzeba wywolac metoda setBounds(), jesli komponent do, ktorego dodajesz te kontrolki ma layout ustationy na null. Robisz tak?
Awatar użytkownika
warlock24
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 102
Rejestracja: 20 cze 2008, 22:35
Płeć: Mężczyzna
Wersja Ubuntu: 12.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [Java] Rysowanie obrazka na JPanel

Post autor: warlock24 »

warlock24 pisze:Witam,

//B - obrazka ani nawet komponentu nie widać
setLayout(null);
image = new MyImage();
image.setBounds(2, 2, 177, 250);
add(image);
Tak. Widać to w moim pierwszym poście :grin:
Awatar użytkownika
Opalo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 07 sty 2009, 09:52
Płeć: Mężczyzna

Odp: [Java] Rysowanie obrazka na JPanel

Post autor: Opalo »

Dziwna sprawa. Pisalem sporo w ten sposb iz awsze dzialalo. Co masz w klasie MyImage? Zarzuc jakiegos zipa moze czy cos..

EDIT:
Na szybko Twoja zagadka:

Kod: Zaznacz cały

package org.opal.swing;

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class ImgPanel extends JPanel {

	private static final long serialVersionUID = -6404557781141208340L;
	private ImageIcon icon = null;

	public ImgPanel() {
		setLayout(null);
		icon = new ImageIcon("cam.jpg");
		setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());
		System.out.println(this);
	}

	@Override
	protected void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		icon.paintIcon(this, g2, 0, 0);
	}
}

Kod: Zaznacz cały

package org.opal.swing;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImgFrame extends JFrame {

	private static final long serialVersionUID = -881271911548685389L;

	public ImgFrame(JPanel p) {
		setRootPaneCheckingEnabled(false);
		setLayout(null);
		add(p);
		setBounds(0, 0, p.getWidth(), p.getHeight());
		setLocation(0,0);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      setVisible(true);
                      System.out.println(this);
	}
}

Kod: Zaznacz cały

package org.opal.swing;


public class Main {

	public static void main(String[] args) {
		new ImgFrame(new ImgPanel());
	}
}
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 11 gości