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:
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);
}
}
}
}
}