Aktualisierung der Darstellung bei verschieden großen Bildern. (Achtung viele Fragen)

misterlister

Grünschnabel
Hallo ich bin derzeit dabei mich in SWING einzuarbeiten und habe folgendes versucht zu programmieren.

Es soll ein Fenster dargestellt werden das einen Menüeintrag hat mit dem man ein beliebiges Bild laden kann. Dieses Bild wird dann anschließend in einem Panel dargestellt. Das Fenster ist so programmiert das es sich je nach Größe des Bildes anpasst. Das ganze funktioniert wenn ich das Fenster von Anfang an mit setSize so groß mache das es größer ist als das größte Bild das ich jemals darstellen will. Ist das Fenster aber zuerst sehr klein dann funktioniert das beim ersten Bild auch noch. Wenn ich jetzt aber ein größeres Bild öffne wird nur ein Ausschnitt der genauso hoch ist wie das alte Bild dargestellt.

Die einzige Möglichkeit das es dann doch noch ganz dargestellt wird ist das Fenster mit der Maus minimal zu vergrößern.

So nun meine Fragen:

- Wieso hat mein Repaint des Panels und sogar des Fensters keine Wirkung aber das
minimale verändern der Fenstergröße mit der Maus (siehe die 3 Zeilen kurz vor der Main Funktion). So wie ich das verstanden habe zeichnet doch die repaint()-Funktion die Komponente neu. Und wenn ich das Fenster neu Zeichne müssten doch auch alle Unterkomponenten neu gezeichnet werden (auch das Panel).

- Wenn ich die prefered Size des Panels z.B. auf 100 x 100 setze müsste das Panel ja sehr klein sein. Wieso wird mit dem öffnen eines Bilder von z.B. 800 x 600 das Bild trozdem ganz angezeigt. Wird das Panel dann automatisch angepasst oder wie funktioniert das und wozu ist dann prefered size da?

- Wozu ist super.paintComponent(g); in der repaint Methode des Panels gut.

- Kennt jemand Informationen dazu wie in Windows das Windowing System funktioniert also Events, Fenstermanager, Zeichnen der Fenster. Damit mein ich jetzt nicht die Api-Schnittstellen sondern wie Windows das technisch umsetzt also wo werden die verschiedenen Fensterdaten gespeichert und woher weis Windows welches Event an welches Fenster geht etc. Ich suche danach schon ca. 4 Wochen, habe mir das Windows Internals Buch gekauft aber da ist auch nix drinn. Kann man das überhaupt rausbekommen oder ist das Betriebsgeheimnis von Microsoft und steht nirgendwo?



Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class BildBetrachter extends JFrame {

	String dateiName;
	Image bild;
	int bildx=0,bildy=0;
	AnzeigeFlaeche anzeigeflaeche = new AnzeigeFlaeche();
	static BildBetrachter fenster;   
	//CBildLeinwand leinwand;
	
	class AnzeigeFlaeche extends JPanel
	{
		public void paintComponent(Graphics g)
		{
			//super.paintComponent(g);
			g.drawImage( bild, 0, 0, this );
			
			
		}
		
		/*public Dimension getMinimumSize()
		{
			return new Dimension(111,111);
		}
		public Dimension getPreferedSize()
		{
			System.out.println(fenster.getSize().height);
			System.out.println(fenster.getSize().width);
			return getMinimumSize();
		
		}*/
	}
	
	class MeinWindowLauscher extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}

	class MeinActionLauscher implements ActionListener 
	{
		public void actionPerformed(ActionEvent e) 
		{
			String Label;

			Label = e.getActionCommand();

			if (Label.equals("Programm beenden")) 
			{
				System.exit(0);
			} else if (Label.equals("Bild laden")) 
			{
				System.out.println("Bild laden");
				bildLaden();
		    }
		}
	}

	BildBetrachter(String titel) {
		
		super(titel);
		
		//getContentPane().setLayout(new FlowLayout());
		addButton("Bild laden",new MeinActionLauscher());
		addButton("Programm beenden",new MeinActionLauscher());
		addmenue();
		add(anzeigeflaeche);
		
		
		addWindowListener(new MeinWindowLauscher());
		
		}
	
	private void addButton(String titel,ActionListener listener)
	{
		JButton button;
		button=new JButton(titel);
		button.addActionListener(listener);
		this.getContentPane().add(button);
	}
	
	private void addmenue()
	{
//		Menüleiste
		JMenuBar menueleiste = new JMenuBar();
		setJMenuBar(menueleiste);
		
		//Untermenüeinträge
		JMenuItem item1= new JMenuItem("Bild laden");
		JMenuItem item2= new JMenuItem("Programm beenden");
		item1.addActionListener(new MeinActionLauscher());
		item2.addActionListener(new MeinActionLauscher());
		
		//Menüeintrag
		JMenu menu1= new JMenu("Datei");
		
		//Untermenüeinträge unter Menüeintrag einhängen
		menu1.add(item1);
		menu1.add(item2);
		
		//Menüeintrag in Menüleiste einhängen
		menueleiste.add(menu1);
	
	}
	
	public void bildLaden()
	{
		Toolkit kit=Toolkit.getDefaultToolkit();
		MediaTracker ladeKontrolle= new MediaTracker(this);
		String dateiname;
		
		FileDialog d = new FileDialog(this,"Bilddatei laden...",FileDialog.LOAD);
		d.setVisible(true);
		dateiname = d.getDirectory();
		dateiname += d.getFile();
	
		if(dateiname == null)
		{
			
			return;
		}
		
		bild = kit.getImage(dateiname);
		ladeKontrolle.addImage(bild,0);
		
		try
		{
			ladeKontrolle.waitForID(0);
		}
		catch(InterruptedException e)
		{
		dateiname=null;
		bild=null;
		
		return;
		}
			
		  fenster.setSize(bild.getWidth(anzeigeflaeche),bild.getHeight(anzeigeflaeche)+55);
		anzeigeflaeche.repaint();
		fenster.repaint();
		
	}

	public static void main(String[] args) {

		fenster = new BildBetrachter("Test");
		fenster.pack();
		fenster.setSize(100,100);
		fenster.setVisible(true);
		
	}
}
 
Mit dem Code den du hier gepostet hast funktioniert doch alles. Zumindest bei mir (Java 1.5). Größere und kleinere Bilder werden mit ihrer korrekten Größe dargestellt.
 
Hy, dann hast du wahrscheinlich das Fenster am Anfang etwas größer gezogen oder? Wenn ich das Fenster am Anfang nicht mindestens so groß mache wie die Grafik die angezeigt werden soll, vergrößert er zwar das JFrame aber das Bild wird trotzdem nur teilweise innerhalb eines bestimmten Ausschnitts welcher die Größe des Ursprungsfensters hat sichtbar.
 

Neue Beiträge

Zurück