JFrame JPanelgrösse fixieren Bild darin skalieren

Status
Nicht offen für weitere Antworten.
O

Ongbak

Gast
Hallo,

Langsam bin ich verzweifelt. Ich habe zwar schon dieverse Forumsbeiträge gelesen, aber bin nie richtig schlauf daraus geworden.
So ungefähr soll das Layout aussehen:

111111122
111111122
111111122
111111122
333333333

Die 1sen ist das JPanel mit dem ich Probleme habe, die 2en und 3en wären andere JPanels die aber noch nicht drinn sind.
Ein JFrame hält alles zusammen.

Was ich gerne möchte. Das JPanel soll in diesem dargestellten Verhältniss erstellt werden und genau so gross sein.
Das Bild darf nur in diesem JPanel in dieser Grösse dargestellte werden.

Probleme. Wenn ich in meinem BorderLayout
Code:
add(spielbrett);
eingebe, dann zeigt wird das Fenster eröffnet, aber das Bild ist grösser als geplant, bzw. das JPanel passt sich dem Bild an anstatt umgekehrt.

Code:
add("West",spielbrett);
bei dem wird zwar das Fenster erstellt, aber das Bild ist weg.

Code:
scaledspielbrett = spielbrett.getScaledInstance(spielBrettBreite,spielBrettHoehe,Image.SCALE_FAST);
Bei dem hier hat er OutOfMemory Probleme, obwohl das bild nur 1117*861 gross ist, ich auf meinem Rechner 1GB im dual channel betrieb habe, das kanns ja echt nicht sein.

Eine weitere Frage: Ist BorderLayout eine gute Wahl für mein Designvorhaben, oder ist das ein Fehlgriff?
Bestimmt der Layoutmanager die grösse des JPanels oder wie sind hier die Wechselwirkungen?

Hier noch der ganze relevante Code:
Code:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

/*
 * GUI Klasse für die Darstellung des gesamten Spielbrettes
 * inklusive den Bedienelementen.
 * Verwaltet alle primären Panels zur Grafikausgabe
 */

public class ThurnNTaxisGUI extends JFrame
{
	private CGUIDaten aktGUI;	//speichert und stellt Grafikinfos bereit.
	private CSpielbrett spielbrett; //JPanel um Spielbrett anzuzeigen
	private int fensterHoehe;	//Speichert Hoehe des Gesamtfensters
	private int fensterBreite;	//Speichert Breite des Gesamtfensters
	public ThurnNTaxisGUI(String titel)
	{
		super(titel);
		
		//Initialisierung von aktGUI
		aktGUI = new CGUIDaten();
		
		//setzt alle Koordinaten auf 0, Startoption
		aktGUI.setXPos(0);
		aktGUI.setYPos(0);
		aktGUI.setBildX1(0);
		aktGUI.setBildX2(0);
		aktGUI.setBildY1(0);
		aktGUI.setBildY2(0);
		
		//Maximiert Fenster über ganzer Desktop
		setExtendedState(this.MAXIMIZED_BOTH);
		
		//Initialisierung des LayoutManagers für die Anordnung der Primären Panels
		setLayout(new BorderLayout());
		
		//Initialisieren des SpielbrettPanels
		//Übergibt 3 Parameter: GUIDatenbank,aktuelle Fensterhöhe,aktuelle fensterBreite
		spielbrett = new CSpielbrett(aktGUI,this);
		add(spielbrett);
		
		//Bei Befehl Fensterschliessen wird Fenster ohne Rückmeldung
		//an den user, gesclossen!!!
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
	}
	public int getFensterBreite() {
		fensterBreite = getHeight();
		return fensterBreite;
	}
	public void setFensterBreite(int fensterBreite) {
		this.fensterBreite = fensterBreite;
	}
	public int getFensterHoehe() {
		fensterHoehe = getWidth();
		return fensterHoehe;
	}
	public void setFensterHoehe(int fensterHoehe) {
		this.fensterHoehe = fensterHoehe;
	}
}
Das JPanel noch:
Code:
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Dimension;
import java.awt.Graphics2D;

/*
 * Oberfläche zur Darstellung des Spielbrettes als Hintergrund
 * Keine aktive Aufgabe.
 * Skalliert bei Fenstergrössenänderung das Spielbrett korrekt
 */
public class CSpielbrett extends JPanel
{
	private ThurnNTaxisGUI hauptFenster; //Referenz auf das Hauptfenster
	private Image spielbrett;	//Speichert temporär die Bilddatei
	private Image scaledSpielBrett; //temporäres skalliertes Bild des Spielbretts
	private CGUIDaten aktGUI;	//Datei mit allen benötigten Daten
	private int spielBrettHoehe;	//Höhe des Spielbretts in Abängigkeit von Hauptfenster
	private int spielBrettBreite;	//Breite des Spielbretts in Abhängig. von Hauptfenster
	
	public CSpielbrett(CGUIDaten aktGUI,ThurnNTaxisGUI HauptFenster)
	{
		//abspeichern der GUI Datenbank
		this.aktGUI = aktGUI;
		
		//abspeichern der Hauptfensterreferenz
		hauptFenster = HauptFenster;
		
		//temporäre Bilddatei abspeichern
		spielbrett = aktGUI.getAktuellesSpielBrett();
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		
		//Berechnet aktuelle Fenstergrösse
		setSpielBrettHoehe(hauptFenster.getFensterHoehe());
		setSpielBrettBreite(hauptFenster.getFensterBreite());
				
		if(spielbrett != null)
			g.drawImage(spielbrett,0,0,this);		
	}
	
	//Gibt die maximale grösse des Panels zurück
	public Dimension getMaximumSize()
	{
		Dimension tmp = new Dimension(spielBrettBreite,spielBrettHoehe);
		return tmp;
	}
	
	//Gibt die bevorzugte Panel grösse zurück
	public Dimension getPreferredSize()
	{
		return getMaximumSize();
	}
	
	public Dimension getMinimumSize()
	{
		return getMaximumSize();
	}

	public int getSpielBrettBreite() {
		return spielBrettBreite;
	}
	
	//@pre: Fensterbreite maximiertes Hauptfenster
	//@post: Transformation im Verhältnis 5/6 = JPanelbreite
	public void setSpielBrettBreite(int spielBrettBreite) {
		this.spielBrettBreite = ((spielBrettBreite/6)*5);
	}

	public int getSpielBrettHoehe() {
		return spielBrettHoehe;
	}

	//@pre: Fensterhöhe maximiertes Hauptfenster
	//@post: Transformation im Verhältnis 5/6 = JPanelhöhe
	public void setSpielBrettHoehe(int spielBrettHoehe) {
		this.spielBrettHoehe = ((spielBrettHoehe/6)*5);
	}
	
}
Ich habe alle Skalierung und Layoutbefehle wieder rausgenommen, waren eh nur 2 Zeilen code, weil dies ja falsch waren.

Ich danke jetzt schon für eure Hilfe

mfg
 
S

SlaterB

Gast
tja, das scheint tatsächlich zunächst nicht zu gehen,
wenn du zwei-drei Panel drin hast, dann werden die Size-Operationen vielleicht doch berücksichtigt,

für nur ein Panel bieten sich andere Layouts an, z.B. BoxLayout, wobei allerdings nicht unbedingt gleich die obere linke gewählt wird..

Code:
public class TestGUI extends JFrame {

	public TestGUI() throws Exception {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(800, 600);

		ImagePanel p = new ImagePanel();
		getContentPane().add(p);
		getContentPane().setLayout(
			new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
		setVisible(true);
	}

	public static void main(String[] args) throws Exception {
		TestGUI t = new TestGUI();
	}

	class ImagePanel extends JPanel {
		private Image image;

		public ImagePanel() {
			loadImage();
			setBorder(BorderFactory.createTitledBorder("ImagePanel"));
		}

		//Gibt die maximale grösse des Panels zurück
		public Dimension getMaximumSize() {
			Dimension tmp =
				new Dimension(
					image.getWidth(this) + 20,
					image.getHeight(this) + 30);
			return tmp;
		}

		//Gibt die bevorzugte Panel grösse zurück
		public Dimension getPreferredSize() {
			return getMaximumSize();
		}
		//Gibt die bevorzugte Panel grösse zurück
		public Dimension getSize() {
			return getMaximumSize();
		}
		public Dimension getMinimumSize() {
			return getMaximumSize();
		}

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(image, 10, 20, this);
		}

		public void loadImage() {
			MediaTracker tracker = new MediaTracker(this);
			image = Toolkit.getDefaultToolkit().getImage("test.jpg");
			tracker.addImage(image, 0);
			try {
				tracker.waitForID(0);
			} catch (InterruptedException exception) {
			}
		}

	}
}
GridBagLayout bietet von den StandardLayouts die meisten Möglichkeiten
 
O

Ongbak

Gast
So, ich habe die zwei anderen Panels noch hinzugefügt und die hintergrundfarbe einfach gsetzt, nur als Platzhalter, zum schauen ob die Panels in rot und blau auftauchen. Leider aber nein. Es taucht weiterhin der grösste Panel auf welches als einziger Panel ein Bild aufruft. Es ist als ob er die anderen Panels unterdürckt, obwohl ich allen genau die Grösstmögiche Grösse angegeben habe. ich weiss einfach nicht was ich falsch mache.

Hier nochmals der code des Hauptfensters:
Code:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

/*
 * GUI Klasse für die Darstellung des gesamten Spielbrettes
 * inklusive den Bedienelementen.
 * Verwaltet alle primären Panels zur Grafikausgabe
 */

public class ThurnNTaxisGUI extends JFrame
{
	private CGUIDaten aktGUI;	//speichert und stellt Grafikinfos bereit.
	private CSpielbrett spielbrett; //JPanel um Spielbrett anzuzeigen
	private CSpielerTisch spielertisch; //JPanel für Spielerkarten und akt. Strasse
	private CGegnerTisch gegnertisch; //JPanel für die Zustände der Gegner
	private int fensterHoehe;	//Speichert Hoehe des Gesamtfensters
	private int fensterBreite;	//Speichert Breite des Gesamtfensters
	public ThurnNTaxisGUI(String titel)
	{
		super(titel);
		
		//Initialisierung von aktGUI
		aktGUI = new CGUIDaten();
		
		//setzt alle Koordinaten auf 0, Startoption
		aktGUI.setXPos(0);
		aktGUI.setYPos(0);
		aktGUI.setBildX1(0);
		aktGUI.setBildX2(0);
		aktGUI.setBildY1(0);
		aktGUI.setBildY2(0);
		
		//Maximiert Fenster über ganzer Desktop
		setExtendedState(this.MAXIMIZED_BOTH);
		
		//Initialisierung des LayoutManagers für die Anordnung der Primären Panels
		BorderLayout layout = new BorderLayout();
		setLayout(layout);
		
		//Initialisieren des SpielbrettPanels
		//Übergibt 3 Parameter: GUIDatenbank,aktuelle Fensterhöhe,aktuelle fensterBreite
		spielbrett = new CSpielbrett(aktGUI,this);
		add("Center",spielbrett);
		
		//Initialisierung des Spielbrettes
		spielertisch = new CSpielerTisch(aktGUI,this);
		add("South",spielertisch);
		
		//Initialisierung des Fenster für die Gegnerinformationen
		gegnertisch = new CGegnerTisch(aktGUI,this);
		add("West",gegnertisch);
		
		//Bei Befehl Fensterschliessen wird Fenster ohne Rückmeldung
		//an den user, gesclossen!!!
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
	}
	public int getFensterBreite() {
		fensterBreite = getHeight();
		return fensterBreite;
	}
	public void setFensterBreite(int fensterBreite) {
		this.fensterBreite = fensterBreite;
	}
	public int getFensterHoehe() {
		fensterHoehe = getWidth();
		return fensterHoehe;
	}
	public void setFensterHoehe(int fensterHoehe) {
		this.fensterHoehe = fensterHoehe;
	}
}

und hier einfach der code eines der anderen zwei panels, sind ja beide fast identisch
Code:
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Dimension;

/*
 * Klasse stellt die aktuellen Karten die der Spieler hat dar
 * Stellt auch aktuelle Strasse dar
 * Angeordnet südlich von Spielbrett
 */
public class CSpielerTisch extends JPanel
{
	private CGUIDaten aktGUI;		//Referenz auf GUIDatenklasse
	private ThurnNTaxisGUI hauptFenster;	//Referenz auf Hauptfenster
	private int spielerTischHoehe;		//aktuelle Höhe 
	private int spielerTischBreite;	//akteulle Breite
	public CSpielerTisch(CGUIDaten guiData,ThurnNTaxisGUI HauptFenster)
	{
		aktGUI = guiData;
		hauptFenster = HauptFenster;
		setBackground(Color.BLUE);
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		
		//Berechnung der aktuellen Fenstergrössen
		setSpielerTischBreite(hauptFenster.getFensterBreite());
		setSpielerTischHoehe(hauptFenster.getFensterHoehe());
	}
	
	//Definition von bevorzugten Panelgrössen
	public Dimension getMaximumSize()
	{
		Dimension tmp = new Dimension(spielerTischBreite,spielerTischHoehe);
		return tmp;
	}
	
	public Dimension getPreferredSize()
	{
		return getMaximumSize();
	}
	
	public Dimension getMinimumSize()
	{
		return getMaximumSize();
	}

	public int getSpielerTischBreite() {
		return spielerTischBreite;
	}

	public void setSpielerTischBreite(int spielerTischBreite) {
		this.spielerTischBreite = (spielerTischBreite);
	}

	public int getSpielerTischHoehe() {
		return spielerTischHoehe;
	}

	public void setSpielerTischHoehe(int spielerTischHoehe) {
		this.spielerTischHoehe = (spielerTischHoehe/6);
	}
}

Sieht irgendwer was ich da in den Sand gesetzt habe, code technisch?

mfg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
Paty JFrame anfänger bräuchte hilfestellung AWT, Swing, JavaFX & SWT 7
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
Mausposition relativ zu JFrame bekommen AWT, Swing, JavaFX & SWT 6
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
N CPU Belastung bei offenem JFrame auf fast 100% AWT, Swing, JavaFX & SWT 15
N Knopf ganz oben (JFrame) AWT, Swing, JavaFX & SWT 9
N JFrame löscht alles, wenn groß gemacht AWT, Swing, JavaFX & SWT 9
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
E JFrame resizing AWT, Swing, JavaFX & SWT 2
E Swing Mausposition auf einem JFrame erkennen AWT, Swing, JavaFX & SWT 5
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Tabelle in JFrame einfügen AWT, Swing, JavaFX & SWT 1
VPChief Ein JFrame ohne setUndecorated(true); nicht verschiebbar machen. AWT, Swing, JavaFX & SWT 6
R Swing Hat mein JFrame meinen Component? AWT, Swing, JavaFX & SWT 2
R Swing Design des oberen Balkens in JFrame AWT, Swing, JavaFX & SWT 2
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
R Swing Ein gezeichneten String aus dem JFrame löschen AWT, Swing, JavaFX & SWT 5
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
T JFrame aktualisieren AWT, Swing, JavaFX & SWT 2
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
T JavaFX JFrame verhalten wie JOptionPane (ErrorMessage) AWT, Swing, JavaFX & SWT 1
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
K Grafik in JFrame einpassen AWT, Swing, JavaFX & SWT 3
D Mit Jmenu neue JFrame öffnen AWT, Swing, JavaFX & SWT 2
J BackgroundJPanel passt sich dem JFrame nicht an AWT, Swing, JavaFX & SWT 7
C Swing JFrame ändert Größe AWT, Swing, JavaFX & SWT 0
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
K JFrame bei JUnit Tests AWT, Swing, JavaFX & SWT 2
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
R Swing JPanels auf JFrame auf verfügbaren Platz aufblasen AWT, Swing, JavaFX & SWT 4
JR2205 Swing JxMaps Einbindung Netbeans JFrame AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
MaxG. JFrame Größe ändern AWT, Swing, JavaFX & SWT 16
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
Ghostman1711 JFrame closing AWT, Swing, JavaFX & SWT 3
R Engineklasse mit JFrame AWT, Swing, JavaFX & SWT 4
M Default-WindowListener JFrame entfernen (Stichwort: iconified) AWT, Swing, JavaFX & SWT 4
ms_cikar Jframe zurück zu frame1 AWT, Swing, JavaFX & SWT 14
C Jframe ohne Rahmen AWT, Swing, JavaFX & SWT 3
lumpigerAffe Swing Jframe aktualisieren AWT, Swing, JavaFX & SWT 27
A Swing JFrame neuzeichnen lassen, position neu berechnen lassen? AWT, Swing, JavaFX & SWT 9
R JFrame schließen AWT, Swing, JavaFX & SWT 9
P Swing JFrame minimiert sich bei Doppelklick auf die Titel-Leiste AWT, Swing, JavaFX & SWT 16
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
I JFrame an Bildschirm anpassen AWT, Swing, JavaFX & SWT 1
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
P JFrame schrumpft bei Doppelklick auf die Titelleiste AWT, Swing, JavaFX & SWT 0
G JFrame - manuell Größe verändern AWT, Swing, JavaFX & SWT 6
D JFrame mindestgröße erzwingen AWT, Swing, JavaFX & SWT 2
H Swing JFrame mit JFXPanel NPE bei dispose() AWT, Swing, JavaFX & SWT 6
C Swing Borderlayout im JFrame AWT, Swing, JavaFX & SWT 4
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
G Swing JFrame öffnen bei Pidgin Benachrichtigung AWT, Swing, JavaFX & SWT 5
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
S Kein JFrame unter Mac? AWT, Swing, JavaFX & SWT 8
G Resize JFrame AWT, Swing, JavaFX & SWT 8
J Teiltransparenter JFrame mit Blur-Effekt AWT, Swing, JavaFX & SWT 2
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
M NetBeans JFrame Grundlangen fragen AWT, Swing, JavaFX & SWT 6
I Neues JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 5
S JFrame -> setVisible AWT, Swing, JavaFX & SWT 3
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
I Swing JMenuBar auch unten am JFrame? AWT, Swing, JavaFX & SWT 2
K SplashScreen neben JFrame behalten AWT, Swing, JavaFX & SWT 10
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
T Applet Applet in JFrame einbinden AWT, Swing, JavaFX & SWT 8
V JFrame wird nicht richtig angezeigt! AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
Y Kann man Buttons in einem JFrame rund machen ? AWT, Swing, JavaFX & SWT 2
W Swing Farbige JPanels auf JFrame werden nicht gezeigt. Was mach ich falsch? AWT, Swing, JavaFX & SWT 7
Z Java Draw -JFrame finde nicht die Mitte & höhe, breite AWT, Swing, JavaFX & SWT 7
O Swing JFrame Anzeigeproblem AWT, Swing, JavaFX & SWT 2
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16

Ähnliche Java Themen

Neue Themen


Oben