2017-04-06 4 views
0

Hallo Ich möchte eine andere Geschichte zu einem Haus malen in PaintComponent durch Klicken auf die Pfeiltaste nach oben und entfernen Sie es durch Klicken auf die Pfeiltaste. Aber ich habe Probleme mit dem KeyListener und ich verstehe nicht, was an diesem Code behoben werden muss.Wie ändert man Farbe durch KeyListener?

importieren javax.swing.JComponent; importieren Sie javax.swing.JFrame;

Haupt-Viewer-Klasse

public class HouseViewer { 

    public static void main(String[] args) { 


    JFrame frame = new JFrame(); 

    frame.setSize(700, 700); 
    frame.setTitle("Cool house program"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JComponent component = new HouseComponent(); 
    frame.add(component); 
    frame.setVisible(true); 


    } 

} 

Komponentenklasse

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import javax.swing.JComponent; 
import java.awt.event.KeyListener; 



public class HouseComponent extends JComponent implements KeyListener { 

    private boolean more; 
    private boolean less; 
    private boolean def; 



    public HouseComponent(){ 
     def = true; 
     this.addKeyListener(this); 
    } 


    public void paintComponent(Graphics g){ 




    if (def) { 

     // Default 

     // 1st rectangle 
     g.drawRect(230, 180, 200, 200); 
     // roof 
     g.drawLine(230, 180, 330, 100); 
     g.drawLine(430, 180, 330, 100); 
     // door and window 
     g.drawRect(260, 280, 50, 100); 
     g.drawRect(350, 310, 45, 45); 
    } 

    if(more) {  

     // roof 
     g.drawLine(230, 180, 330, 45); 
     g.drawLine(430, 180, 330, 45); 

     // 2nd story rectangle 
     g.drawRect(230, 180, 200, 100); 

     // 1st rectangle 
     g.drawRect(230, 180 + 100, 200, 200); 


     // door and window 
     g.drawRect(260, 280 + 100, 50, 100); 
     g.drawRect(350, 310 + 100, 45, 45); 

    } 


    if (less) { 

     // 1st rectangle 
     g.drawRect(230, 180, 200, 200); 
     // roof 
     g.drawLine(230, 180, 330, 100); 
     g.drawLine(430, 180, 330, 100); 
     // door and window 
     g.drawRect(260, 280, 50, 100); 
     g.drawRect(350, 310, 45, 45); 

    } 








    } 



    public void keyPressed(KeyEvent e) { 
     int key = e.getKeyCode(); 



     switch(key) 
     { 

     case KeyEvent.VK_UP: 

     more = true; 
     less = false; 
     def = false; 
     repaint(); 


     case KeyEvent.VK_DOWN: 

     more = false; 
     less = true; 
     repaint(); 



    } 

    } 


    public void keyReleased(KeyEvent e) { 

    } 


    public void keyTyped(KeyEvent e) { 


    } 


} 
+0

Was ist das Problem? –

+0

Ich weiß nicht, wie Schlüsselereignisse die Hausmalerei ändern – Darknax

+0

Fügen Sie ein 'break;' am Ende jedes 'case' hinzu. Siehe https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html – Berger

Antwort

0

Haben fügen Sie eine Debug-Code zu sehen, ob Ihre Zuhörer Code ausgeführt wird?

KeyEvents werden mit Fokus an die Komponente gesendet. Standardmäßig ist eine JComponent nicht fokussierbar, sodass die Komponente das Ereignis nicht empfängt.

Die bessere Lösung ist Key Bindings zu verwenden. Key Bindings funktionieren auch dann, wenn eine Komponente keinen Fokus hat.

Lesen Sie den Abschnitt aus dem Swing-Tutorial auf How to Use Key Bindings für weitere Informationen.

Auschecken Motion Using the Keyboard für einen Vergleich zwischen der Verwendung eines KeyListner und Key Bindings. Es wird gezeigt, was Sie tun müssen, um den KeyListener zum Laufen zu bringen, indem Sie die Komponente fokussierbar machen, obwohl es nie eine Garantie gibt, dass die Komponente nicht den Fokus verliert.

+0

Ich bin gezwungen, einen KeyListener zu verwenden. Womit kann ich die JComponent ersetzen? – Darknax

+0

@Darknax, war gerade in der Mitte des Hinzufügens von zusätzlichen Informationen zu der Antwort. – camickr

+0

Woah ich reparierte es. Alles was ich tun musste, war das Hinzufügen von this.setFocusable (true) zum Konstruktor. Vielen Dank ! – Darknax

0

Fügen Sie break; für alle Switch-Fälle hinzu. Auch umbenennen Methode paintComponent zu paint

+0

Ich bin mir nicht sicher, aber wenn man sich Quellen der 'paint' Methode ansieht, kann man die 'paintComponent' Methode unter Bedingung sehen, also können Klassen' paintComponent' nicht direkt aufrufen (weil es geschützt ist) und eine andere Klasse' paint' nennen Methode. Vielleicht war hier ein Problem – ZhenyaM

Verwandte Themen