Interface Bilder mit Graphics g zeichnen

CptK

Bekanntes Mitglied
Hallo,
ich habe mit Graphics meinen Hintergrund bestehend aus 3 ebenen gezeichnet und möchte nun, dass dieser mit dem Keylistner bewegt werden kann. Das Problem ist, dass ich nicht weiß, wie ich den X-Wert so ändere, dass er auch übernommen wird...
Java:
package Gui;

import java.awt.*;

import javax.swing.*;

import Actions.ImageLoader;

public class Panel extends JPanel {
   
    private static final long serialVersionUID = 1L;
    private ImageLoader il = new ImageLoader();   
    private int bgX = -1000;
   
    public Panel() {
       
        new JPanel();
        setSize(1000,743);
        setLayout(null);
        setVisible(true);
        repaint();
       
    }
   
    public void paintComponent(Graphics g) {
       
        g.drawImage(il.BgE3(), bgX, 0, 3000, 743, null);
        g.drawImage(il.BgE2(), bgX, 0, 3000, 743, null);
        g.drawImage(il.BgE1(), bgX, 0, 3000, 743, null);
       
    }
   
    public Panel(String x) {    System.out.println("Panel wurde aufgerufen aus der Klasse " + x);     }
   
    public void setBgX(int bgx) {    bgX = bgx; repaint();    }
   
    public int getBgX() {    return bgX;    }

}
Java:
package Actions;

import java.awt.event.*;

import Gui.Panel;

public class KeyHandler implements KeyListener {
   
    Panel p = new Panel("KeyHandler");
   
    @Override
    public void keyPressed(KeyEvent e) {
       
        if(e.getKeyCode() == KeyEvent.VK_LEFT) {
            if(p.getBgX() <= 0){
                p.setBgX(p.getBgX() + 5);
                p.repaint();
            }
        }
       
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
       
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
       
    }

}

Ich habe Methoden, die den x-Wert ändern, jedoch passiert wenn ich die Taste drücke nichts. Wäre schön wenn mir jemand sagen könnte, was ich falsch gemacht habe und wie es richtig geht.

PS: Ich habe dem JFrame den KeyListner auch hinzugefügt.

Vielen Dank für die Hilfe!
 
@Robat mache ich, aber in der JFrame Klasse
Java:
package Gui;

import java.awt.Point;
import java.awt.Toolkit;

import javax.swing.*;
import Actions.*;

public class Main extends JFrame {
   
    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
        new Main();       
    }
   
    public Main() {
       
        new JFrame();
        setSize(1000,743);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);
        setLocationRelativeTo(null);
        setResizable(false);
        requestFocus();
        addMouseListener(new MouseHandler());
        addMouseMotionListener(new MouseMotionHandler());
        addKeyListener(new KeyHandler());
        setContentPane(new Panel());
       
        try {
         ImageIcon icon = new ImageIcon("rsc/zielen.png");
         setCursor(Toolkit.getDefaultToolkit().createCustomCursor(icon.getImage(),new Point(0,0),"custom cursor"));
        }    catch(Exception e)    {System.out.println("klappt net");    }
       
        setVisible(true);
       
       
    }

}
oder muss das in der Panel Klasse nochmal sein?
 
Okay das wusste ich natürlich nicht.

1. Ruf nicht setContentPane(new Panel()); auf sondern benutz die add() Methode. Es ist hier nicht nötig das ContentPane vom JFrame zu tauschen
2. Das Panel was du dem JFrame hinzufügst hat nichts mit dem Panel aus Listener zu tun! Nur weil du 2 Kisten nebeneinander stellst, heißt es nicht dass beide den selben Inhalt haben.
Du musst das Panel, was du in der Main Klasse erstellst, dem KeyHandler im Konstruktor übergeben, um damit in der KeyHandler-Klasse zu arbeiten. Du darfst im KeyHandler kein neues Panel Objekt erstellen.
3. Die Aufrufe new JFrame() bzw new JPanel() in den Konstruktoren sind sinnlos. Weißt du was du da machst bzw hat es einen tiefsinnigen Grund, dass du das machst?
 
Also tut mir leid falls das ein bisschen dumm rüber kommt, aber ich mache das gerade zum ersten Mal, also ich habe jetzt das
Java:
new JFrame();
und
Java:
new JPanel();
entfernt und in der Klasse KeyHandler das Objekt des Panels entfernt, allerdings verstehe ich nicht wie ich das nun an den KeyHandler übergeben soll.
 
Du kannst den Konstruktor von deinem KeyHandler ein Panel-Objekt mitgeben. Hier mal an einem kleinen Beispiel
Java:
class Main {
    public Main() {
        JFrame frame = new JFrame();
        ...
        Panel panel = new Panel();
        frame.addMouseListener(new KeyHandler(panel));
        frame.add(panel);
    }
}

class KeyHanlder implements ...{
    private Panel panel;
    public KeyHandler(Panel panel) {
        this.panel = panel;
    }
}
 

Zurück
Oben