AWT Frame-Inhalt in Echtzeit skalieren

Status
Nicht offen für weitere Antworten.

subD

Neues Mitglied
Hi zusammen,
nach einiger Zeit des Mitlesens nun meine kleine Forenpremiere :)
Zu meinem Problem:
Ich versuche schon die ganze Zeit den Inhalt eines Frames anständig zu skalieren, kriege es aber nicht wirklich hin.
Das ganze soll so geschehen, dass sich beim Vergrößern (sprich auf eine Ecke klicken und ziehen) automatisch der Inhalt anpasst.
Wenn ich das Fenster vergrößere wird der Inhalt aufgrund des Aufrufs von paint() auch neu gezeichnet. Leider funktioniert das aber nicht beim Verkleinern des Fensters. Ich hab es auch schon mit einem ComponentListener probiert (Methode componendResized()) aber das funktioniert auch nicht.

Hat jemand evtl. eine Idee dazu?


Hier mein Beispiel-Code:
Code:
import java.awt.*;

public class awtProg_01{
	public static void main(String[] args){
		boolean[][] spielfeld = new boolean[15][18];
		for (int i=0; i<spielfeld.length; ++i)
			for (int j=0; j<spielfeld[0].length; ++j)
				spielfeld[i][j] = java.lang.Math.random() > 0.5;
		MyFrame wnd = new MyFrame("Spielfeld", spielfeld);
	}
}


class MyFrame extends Frame{
	private int stoneSize;
	private final boolean[][] spielfeld;
	private int shapeValue;
	private Dimension windowSize;
	
	MyFrame(String name, boolean[][] spielfeld){
		super(name);
		this.spielfeld = spielfeld;
		stoneSize = getStdSize();
			
		setSize(stoneSize * spielfeld.length, stoneSize * spielfeld[0].length);
		windowSize = getSize();
		setVisible(true);	
	}
	
	public void paint(Graphics g){
		paintGrid(g);
		paintStones(g);
		scaleSize();
		
		if (!getSize().equals(windowSize)){
		repaint();
			windowSize = getSize();
		}	
	}
	
	
	/** 
	 * liefert Standard-Spielsteingröße, errechnet sich aus halber Bildschirmauflösung
	 * und Anzahl der Steine in x- und y-Richtung. Der kleinere Wert wird gewählt.
	 */
	private int getStdSize(){
		int a = getToolkit().getScreenSize().width / 2 / spielfeld.length;
		int b = getToolkit().getScreenSize().height / 2 / spielfeld[0].length;
		return a<=b? a : b;
	}
	
	
	/**
	 * skaliert die Spielsteingröße 'stoneSize' abhängig von der Fenster-Auflösung
	 */
	private void scaleSize(){
		int a = getWidth() / spielfeld.length;
		int b = getHeight() / spielfeld[0].length;
		stoneSize = a <= b ? a: b;
	}
	
	
	/**
	 * zeichnet ein Grundgitter, Größe abhängig von der Anzahl
	 * von Steinen in x- und y-Richtung 'spielfeld.length' bzw 'spielfeld[0].length' 
	 * und der Spielsteingröße 'stoneSize'.
	 */
	private void paintGrid(Graphics g){
		for (int i=stoneSize; i<= stoneSize * spielfeld.length; i += stoneSize)
			g.drawLine(i, 0, i, stoneSize * spielfeld[0].length);					// Senkrechte
		for (int j=stoneSize; j<= stoneSize * spielfeld[0].length; j += stoneSize)
			g.drawLine(0, j, stoneSize * spielfeld.length, j);						// Waagerechte
	}
	
	
	private void paintStones(Graphics g){
		for (int pos_x=0; pos_x < spielfeld.length; ++pos_x){
			for (int pos_y=0; pos_y < spielfeld[0].length; ++pos_y){
				if (spielfeld[pos_x][pos_y]){						// zeichne nur, wenn Feld belegt
					g.fillOval(pos_x*stoneSize, pos_y*stoneSize, stoneSize, stoneSize);
				}
			}
		}
	}
	
}
 
G

Guest

Gast
Kann es sein, daß das nur mit JFrames funktioniert, nicht aber mit normalen Frames?
 
G

Guest

Gast
Also ich weiß nicht ob ich da jetzt nen riesigen Denkfehler habe, aber es funktioniert so einfach nicht. Hier mal meine Beobachtungen dazu: Mein Fenster wird aus Frame abgeleitet.

- ohne setDynamicLayout(true) wird die paint()-Methode immer während der Fenstervergrößerung aufgerufen. Der Clipping-Bereich wird gezeichnet.

- mit setDynamicLayout(true) gibt es keine Veränderung.


Ein deutlich anderes Verhalten erziele ich, wenn ich meine Klasse aus JFrame ableite:
- ohne setDynamicLayout(true) wird paint() immer während der Fenstervergrößerung aufgerufen (der Clipping-Bereich wird gezeichnet, beim Loslassen der Maustaste aber der komplette Fensterinhalt gelöscht).
Bei Verkleinerung gibt es den paint()-Aufruf nur beim Loslassen der Maustaste, wobei der Inhalt nicht gelöscht wird (aber auch nur dann, wenn ich in beiden Dimensionen gleichzeitig verkleinere.)

- mit setDynamicLayout(true) wird paint() nur während der Fensterverkleinerung ausgeführt. Bei Vergrößerung gibt es keinen Aufruf. Ein Löschen des Fensterinhalts geschieht hier ebenso.

Hoffe mir kann das mal jemand genauer erklären.

Mein Code, an dem ich das getestet habe:
Code:
import java.awt.*;
import javax.swing.*;
 
public class test04 extends Frame{
	Dimension wndSize;
	int i;
	boolean flip;
	public test04()
	{
		//this.getToolkit().setDynamicLayout(true);
	}
 
	public static void main(String[] args)
	{
		Frame frame = new test04();
		frame.setSize(300, 200);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	 }
	 
	 public void paint (Graphics g){
	 	//g.setClip(0,0, getSize().width, getSize().height);
	 	System.out.println("paint() zum " + ++i +".");
	 	System.out.println("Fenstergroesse: " + getSize());
	 	System.out.println("Clipping-Bereich: " + g.getClip() +"\n----------------------------");
	 	wndSize = getSize();
	 	if (flip)
	 		g.drawOval(0,0,wndSize.width, wndSize.height);
	 	else{
	 		g.drawLine(0,0,wndSize.width, wndSize.height);
	 		g.drawLine(0, wndSize.height, wndSize.width, 0);
	 	}
	 	flip = !flip;
	 }
}
 
B

Beni

Gast
Also erklären kann ich dir das nicht. Was intern bei AWT abläuft, versteht niemand :wink:

Aber eine Alternative Lösung: nicht direkt auf ein Frame zeichnen, sondern auf ein Canvas. Dann das Canvas einem Frame hinzufügen, und mit setDynamicLayout sagen, dass bei einer Grössenänderung das Canvas auch verändert werden soll.
Code:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Toolkit;

public class Test4 extends Canvas{
   private int i;
   private boolean flip;

   public static void main(String[] args){
      Frame frame = new Frame();
      frame.setSize(300, 200);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
	  frame.setLayout( new GridLayout( 1, 1 ));
	 
	  frame.add( new Test4() );
	  
	  Toolkit.getDefaultToolkit().setDynamicLayout( true );
    }
   
    public void paint (Graphics g){
       //g.setClip(0,0, getSize().width, getSize().height);
		
       System.out.println("paint() zum " + ++i +".");
       System.out.println("Fenstergroesse: " + getSize());
       System.out.println("Clipping-Bereich: " + g.getClip() +"\n----------------------------");
       Dimension wndSize = getSize();
	   g.setColor( Color.BLACK );
       if (flip)
          g.drawOval(0,0,wndSize.width, wndSize.height);
       else{
          g.drawLine(0,0,wndSize.width, wndSize.height);
          g.drawLine(0, wndSize.height, wndSize.width, 0);
       }
       flip = !flip;
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
Luk10 Frame-Inhalt wird nicht angezeigt! AWT, Swing, JavaFX & SWT 2
T Tabellen Inhalt in einem "anderem Frame" aktuallie AWT, Swing, JavaFX & SWT 7
R Bei JDialog verschwindet der Inhalt aus übergeordneten Frame AWT, Swing, JavaFX & SWT 2
R Inhalt von Frame löschen AWT, Swing, JavaFX & SWT 3
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
Kotelettklopfer Frame ändert Farbe nicht AWT, Swing, JavaFX & SWT 12
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
C Swing F5 Taste neu laden auf ganzen Frame AWT, Swing, JavaFX & SWT 9
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
S Tastatur frame nur nur 1 mal öffnen AWT, Swing, JavaFX & SWT 1
T Swing Java-Frame bei Programmstart NICHT im Vordergrund öffnen AWT, Swing, JavaFX & SWT 2
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
T Frame öffnet nicht AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M Internal Frame in den vordergrund AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
D Buttons erscheinen nicht auf Frame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
P Frame friert ein AWT, Swing, JavaFX & SWT 6
Z Frame mit Rechteck! AWT, Swing, JavaFX & SWT 16
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
M Swing "Frame.setResizable(false);" verschiebt Content? AWT, Swing, JavaFX & SWT 9
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
D Buttons erscheinen nicht auf dem zweiten Frame AWT, Swing, JavaFX & SWT 4
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
BRoll Frame- Video einbinden machbar? AWT, Swing, JavaFX & SWT 6
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
B Frame always on top nur auf anderem Frame AWT, Swing, JavaFX & SWT 9
S Aufteilung von JPanels in einem Frame AWT, Swing, JavaFX & SWT 13
K Options-Frame integrieren (zum zuschalten und wegschalten wie geht man da ran? AWT, Swing, JavaFX & SWT 7
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
N Swing Endlosschleife blockt Frame AWT, Swing, JavaFX & SWT 11
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
N Swing Frame ungewollt transparent! AWT, Swing, JavaFX & SWT 2
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
Daniel_L Drop von Dateien auf Frame - welche Drop-Location? AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
C LookAndFeel Frame updated nicht vollständig AWT, Swing, JavaFX & SWT 9
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
J 2 Bereiche im Frame komplett nutzen - Welchen Layoutmanager? AWT, Swing, JavaFX & SWT 3
Z Swing JTextfield auf Frame AWT, Swing, JavaFX & SWT 13
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
L Frame Schließen und neustarten AWT, Swing, JavaFX & SWT 4
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
P Frame "always on top" und welche GUI? AWT, Swing, JavaFX & SWT 5
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
J Swing Frame öffnen aus Frame mit JButton AWT, Swing, JavaFX & SWT 2
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
M erstes Frame wartet auf die Auswertung eines zweiten AWT, Swing, JavaFX & SWT 8
J Frame-Steuerelement AWT, Swing, JavaFX & SWT 2
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
F Hintergrundbild im Frame AWT, Swing, JavaFX & SWT 11
S Zeichnen führt zu transparentem Frame AWT, Swing, JavaFX & SWT 6
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
B Frame im Frame? AWT, Swing, JavaFX & SWT 4
C WindowListener Frame AWT, Swing, JavaFX & SWT 8
P klassenübergreifendes Frame AWT, Swing, JavaFX & SWT 6
B Text soll nich über das Frame hinausgehen AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
S Swing Panelgröße anpassen wenn Frame maximiert wird AWT, Swing, JavaFX & SWT 2
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
A Hintergrund von einem Frame ändern AWT, Swing, JavaFX & SWT 3
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
M Im Frame wird nur die Menüleiste erstellt und nicht die Tabelle? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben