Bewegtes Bild im BorderLayout.CENTER

maze7799

Mitglied
Hallo, ich habe folgendes Problem:

Ich habe kürzlich angefangen mit der GUI-Programmierung und mir aus Lernzwecken versucht ein Cockpit zu programmieren, zumindest soll es so aussehen.
Nun habe ich das ganze mit einem ganz normalen BorderLayout gemacht und in die verschiedenen Bereiche, also North, South , South und West jeweils ein JPanel mit einem anderen Layout gemacht. Im Center möchte ich aus Testzwecken ein schwarzes Viereck hinsetzten, welches ich mit dem Keyboard bewegen kann. Mein Problem ist, dass ich mit meinem Code das schwarze Vierecck bewegen kann, wenn das BorderLayout.North & BorderLayout.West beide nicht besetzt sind. sobald jedoch eines dieser LayoutTeile besetzt ist kann ich das schwarze viereck gar nicht bewegen. Zum nachvollziehen habe ich mir einen System.out.println-Befehl geschrieben der guckt ob überhaut eine Eingabe registriert wird und habe herausgefunden, dass dies nicht der Fall ist sobald diese beiden JPanels in den genannten Raumrichtungen liegen.

Hier ist mein Code in den Bildern und das eine ist diese Graphische Oberfläche vom Cockpit.

Ich würde mich sehr freuen, wenn mir jemand schreiben könnte wie ich es hinbekomme das Viereck im Center zu bewegen ohne die beiden JPanel zu entfernen.
Vielen Dank schonmal.
 

Anhänge

  • Cockpit Bild.PNG
    Cockpit Bild.PNG
    219,3 KB · Aufrufe: 43
  • PanelCenter 1.PNG
    PanelCenter 1.PNG
    57,6 KB · Aufrufe: 37
  • Cockpit main.PNG
    Cockpit main.PNG
    40,6 KB · Aufrufe: 38
  • GUI-Klasse.PNG
    GUI-Klasse.PNG
    77,2 KB · Aufrufe: 31
  • Panel Center 2.PNG
    Panel Center 2.PNG
    47,3 KB · Aufrufe: 35
Mein Problem ist, dass ich mit meinem Code das schwarze Vierecck bewegen kann, wenn das BorderLayout.North & BorderLayout.West beide nicht besetzt sind. sobald jedoch eines dieser LayoutTeile besetzt ist kann ich das schwarze viereck gar nicht bewegen. Zum nachvollziehen habe ich mir einen System.out.println-Befehl geschrieben der guckt ob überhaut eine Eingabe registriert wird und habe herausgefunden, dass dies nicht der Fall ist sobald diese beiden JPanels in den genannten Raumrichtungen liegen.
Offenbar hat eine andere Komponente den Fokus. Klick mal vorher in die leere Komponente rein.
 
Hab herausgefunden wie das mit den Code-Tags geht, hier ist nochmal der Text in dieser Form: Die Imports habe ich nicht dazugeschrieben, habe ich aber auch alle drin:

[CODE lang="java" title="Main Klasse"]public class CockpitMain {

public static void main(String[] args) {

CockpitGUI gui = new CockpitGUI() ;
gui.setVisible(true);
}
}
[/CODE]

Die anderen Panels ( North , South , East , West) habe ich nicht weiter aufgeführt, man kann aber in den Screenshots sehen, was da so drin ist

[CODE lang="java" title="GUI-Klasse"]public class CockpitGUI extends JFrame {

private PanelNorth panelNorth ;
private PanelSouth panelSouth ;
private PanelEast panelEast ;
private PanelWest panelWest ;
private PanelCenter panelCenter ;


public CockpitGUI() {
super("Cockpit") ;
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1300, 1000) ;
this.initialisiereBorderKomponenten();
this.orderComponents();
System.out.println("GUI") ;


}

private void initialisiereBorderKomponenten() {
panelNorth = new PanelNorth() ;
panelSouth = new PanelSouth() ;
panelEast = new PanelEast() ;
panelWest = new PanelWest() ;
panelCenter = new PanelCenter() ;
System.out.println("Panel erzeugt") ;
}
private void orderComponents() {
this.getContentPane().add(panelNorth , BorderLayout.NORTH) ;
this.getContentPane().add(panelEast , BorderLayout.EAST) ;
this.getContentPane().add(panelWest , BorderLayout.WEST) ;
this.getContentPane().add(panelSouth , BorderLayout.SOUTH) ;
this.getContentPane().add(panelCenter , BorderLayout.CENTER);

}
}
[/CODE]



[CODE lang="java" title="Center-Panel-Klasse"]public class PanelCenter extends JPanel implements ActionListener , KeyListener{


Timer timer = new Timer(5,this);
int x = 0, y = 0, velX = 0, velY = 0;

public PanelCenter() {
timer.start();
addKeyListener(this);
setFocusable(true);
setRequestFocusEnabled(false);

System.out.println("ist im PanelCenter") ;

}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillRect(x,y,50,50);

}

@Override
public void keyTyped(KeyEvent e) {


}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Ist in KeyPressed-Methode angekommen") ;
if(e.getKeyCode() == KeyEvent.VK_W) {
System.out.println("W") ;
velX = 0;
velY = -1;
}
if(e.getKeyCode() == KeyEvent.VK_S) {
velX = 0;
velY = 1;
}

if(e.getKeyCode() == KeyEvent.VK_A) {
velX = -1;
velY = 0;
}
if(e.getKeyCode() == KeyEvent.VK_D) {
velX = 1;
velY = 0;
}

}

@Override
public void keyReleased(KeyEvent e) {
velX = 0 ;
velY = 0 ;
}

@Override
public void actionPerformed(ActionEvent e) {
if(x < 0) {
velX = 0;
x = 0;
}

if(x > 800) {
velX = 0;
x = 335;
}

if(y < 0) {
velY = 0;
y = 0;
}

if(y > 800) {
velY = 0;
y = 312;
}

x = x + velX;
y = y + velY;
repaint();
}
}[/CODE]
 

Neue Themen


Zurück
Oben