Hi,
ich bin neu in diesem Forum und kenne mich mit Swing-Programmierung noch nicht so gut aus:
Ich brauche ein JFrame innerhalb von dem ich mehrere Rechtecke zeichne und die Anzahl der Rechtecke soll sich verändern wenn sich die Fenstergröße ändert.Dazu habe ich eine Kindklasse von JPanel erstellt und die paintComponent Methode überschrieben. Die überschriebene paintComponent Methode macht das mit einen zweidimensionalen Arrays:
Sieht so aus:
[JAVA=53]
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
// boolean[][] Kopie = new boolean[this.getSize().height][this.getSize().width];
//
// for(int x=0; x<feld.length; x++){
// for(int y=0; x<feld[x].length; y++){
//
// while(x < Kopie.length && y < Kopie[x].length){
// Kopie[x][y]= feld[x][y];
// }
//
// }
// }
// feld = Kopie;
for(int x = 0; x < feld.length; x++){
for(int y = 0; y < feld[0].length; y++){
if(feld[x][y]){
g.setColor(Color.RED);
}else{
g.setColor(Color.BLACK);
}
g.fillRect(x*10, y*10, 9, 9);
}
}
}
[/code]
Dass mit dem Fenstergröße ändern, habe ich in der paintComponent Methode versucht, aber dabei hat sich das Programm immer aufgehängt.
Also habe ich versucht, diese Methode in in einem HierarchyBoundsListener innerhalb vom Konstruktor zu setzen, sodass er die Arraylänge nach jeder Größenänderung neu berechnet.
Dass sieht dann so aus:
[JAVA=18]
public Rechteck(boolean[][] feld){
this.feld = feld;
this.addHierarchyBoundsListener(new HierarchyBoundsListener(){
@Override
public void ancestorMoved(HierarchyEvent e) {
System.out.println("moved");
}
@Override
public void ancestorResized(HierarchyEvent e) {
boolean[][] Kopie = new boolean[this.getSize().height][this.getSize().width];
for(int x=0; x<feld.length; x++){
for(int y=0; x<feld[x].length; y++){
while(x < Kopie.length && y < Kopie[x].length){
Kopie[x][y]= feld[x][y];
}
}
}
feld = Kopie;
}
});
}
[/code]
Blöderweise greift dass Programm jetzt bei this natürlich nicht auf dass Panel (also hier die Klasse Rechteck) zu sondern auf den Listener.
Gibt es irgendeine möglichkeit auf das Panel innerhalb vom Listener wieder auf das Panel zuzugreifen???:L
ich bin neu in diesem Forum und kenne mich mit Swing-Programmierung noch nicht so gut aus:
Ich brauche ein JFrame innerhalb von dem ich mehrere Rechtecke zeichne und die Anzahl der Rechtecke soll sich verändern wenn sich die Fenstergröße ändert.Dazu habe ich eine Kindklasse von JPanel erstellt und die paintComponent Methode überschrieben. Die überschriebene paintComponent Methode macht das mit einen zweidimensionalen Arrays:
Sieht so aus:
[JAVA=53]
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
// boolean[][] Kopie = new boolean[this.getSize().height][this.getSize().width];
//
// for(int x=0; x<feld.length; x++){
// for(int y=0; x<feld[x].length; y++){
//
// while(x < Kopie.length && y < Kopie[x].length){
// Kopie[x][y]= feld[x][y];
// }
//
// }
// }
// feld = Kopie;
for(int x = 0; x < feld.length; x++){
for(int y = 0; y < feld[0].length; y++){
if(feld[x][y]){
g.setColor(Color.RED);
}else{
g.setColor(Color.BLACK);
}
g.fillRect(x*10, y*10, 9, 9);
}
}
}
[/code]
Dass mit dem Fenstergröße ändern, habe ich in der paintComponent Methode versucht, aber dabei hat sich das Programm immer aufgehängt.
Also habe ich versucht, diese Methode in in einem HierarchyBoundsListener innerhalb vom Konstruktor zu setzen, sodass er die Arraylänge nach jeder Größenänderung neu berechnet.
Dass sieht dann so aus:
[JAVA=18]
public Rechteck(boolean[][] feld){
this.feld = feld;
this.addHierarchyBoundsListener(new HierarchyBoundsListener(){
@Override
public void ancestorMoved(HierarchyEvent e) {
System.out.println("moved");
}
@Override
public void ancestorResized(HierarchyEvent e) {
boolean[][] Kopie = new boolean[this.getSize().height][this.getSize().width];
for(int x=0; x<feld.length; x++){
for(int y=0; x<feld[x].length; y++){
while(x < Kopie.length && y < Kopie[x].length){
Kopie[x][y]= feld[x][y];
}
}
}
feld = Kopie;
}
});
}
[/code]
Blöderweise greift dass Programm jetzt bei this natürlich nicht auf dass Panel (also hier die Klasse Rechteck) zu sondern auf den Listener.
Gibt es irgendeine möglichkeit auf das Panel innerhalb vom Listener wieder auf das Panel zuzugreifen???:L