Guten Abend,
ich habe mich die letzten Stunden mit der repaint()-Methode beschäftigt(und auch mal revalidate() in Betracht gezogen) und bin zu dem Schluss gekommen, dass der Folgende Code nicht so klappt wie ich es möchte, da das Layout zwar ein Mal im Konstruktor(wie ihr sehen werdet) aufgerufen wird, danach aber nicht nochmal aktualisiert. Wie bekomme ich es am Besten hin, dass sich nach einer Tasteneingabe das Layout aktualisiert?
In der KeyPressed Methode der zweiten Klasse verändert sich der posY, Wert, da ich ihn durch manuelles debuggen auf der Konsole anzeigen lasse(durch println()). Also wird mein Wert bei VK.DOWN betätigung geändert. Wie aber könnte ich das LayOut dann am geschicktesten "aktualisieren"? Repaint okay, das führt er im Hintergrund aus, das aktualisiert aber nicht das JPanel an sich, oder? Sieht einfach nur danach aus.
ich habe mich die letzten Stunden mit der repaint()-Methode beschäftigt(und auch mal revalidate() in Betracht gezogen) und bin zu dem Schluss gekommen, dass der Folgende Code nicht so klappt wie ich es möchte, da das Layout zwar ein Mal im Konstruktor(wie ihr sehen werdet) aufgerufen wird, danach aber nicht nochmal aktualisiert. Wie bekomme ich es am Besten hin, dass sich nach einer Tasteneingabe das Layout aktualisiert?
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class SpielFenster extends JFrame {
public SpielFenster(){
this.setTitle("Schiffe versenken");
this.setSize(446, 478);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((d.width-418)/2, (d.height-450)/2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SpielFeld sf = new SpielFeld();
StatusLeiste sl = new StatusLeiste();
Koordinaten1 k1 = new Koordinaten1();
Koordinaten2 k2 = new Koordinaten2();
addKeyListener(new SpielFeld());
this.setLayout(new BorderLayout());
this.add(sf);
this.add(sl , BorderLayout.SOUTH);
this.add(k1);
this.add(k2);
this.setResizable(false);
this.setVisible(true);
}
}
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SpielFeld extends JPanel implements KeyListener{
int posX;
int posY;
public SpielFeld(){
this.setSize(401, 400);
this.setLocation(40,40);
this.setBackground(Color.blue);
this.requestFocus();
}
public void paint(Graphics g){
Font test = new Font("Serif" , Font.BOLD , 25);
super.paint(g);
g.setColor(Color.black);
for(int i = 0 ; i < 10 ; i++){
for(int j = 0 ; j < 10 ; j++){
g.drawRect(i*40, j*40, 40, 40);
}
}
g.setColor(Color.BLACK);
g.fillRect(posX, posY, 80, 40);
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println(posY);
posY = posY + 40;
this.revalidate();
this.repaint();
if(posY > 360){
posY = 0;
}
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
In der KeyPressed Methode der zweiten Klasse verändert sich der posY, Wert, da ich ihn durch manuelles debuggen auf der Konsole anzeigen lasse(durch println()). Also wird mein Wert bei VK.DOWN betätigung geändert. Wie aber könnte ich das LayOut dann am geschicktesten "aktualisieren"? Repaint okay, das führt er im Hintergrund aus, das aktualisiert aber nicht das JPanel an sich, oder? Sieht einfach nur danach aus.