2017-04-06 5 views
0

こんにちは私は、矢印キーをクリックしてpaintComponentに描かれた家に別の物語を追加し、矢印キーをクリックして削除します。しかし、私はKeyListenerに関する問題があり、私はこのコードについて何が修正されているのか理解していません。KeyListenerを通してペイントを変更するには?

import javax.swing.JComponent; import javax.swing.JFrame;

メインビューアー・クラス

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); 


    } 

} 

Componentクラス

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

問題は何ですか? –

+0

私はキーイベントが家の絵を変える方法を知らない。 – Darknax

+0

それぞれの 'case'の終わりに'; 'を追加する。 – Berger

答えて

0

は、あなたのリスナーのコードが実行されているかどうかを確認するために、任意のデバッグコードを追加しましたか?

KeyEventsは、フォーカスのあるコンポーネントに送出されます。デフォルトでは、JComponentはフォーカス可能ではないため、コンポーネントはイベントを受信しません。

より良い解決策は、Key Bindingsを使用することです。キーバインディングは、コンポーネントにフォーカスがない場合でも機能します。

詳細については、How to Use Key BindingsのSwingチュートリアルのセクションを参照してください。

Motion Using the Keyboardを参照して、KeyListnerとKey Bindingsの比較を確認してください。コンポーネントがフォーカスを失わないという保証はありませんが、コンポーネントをフォーカス可能にすることによってKeyListenerを動作させるために必要なことが示されます。

+0

私はKeyListenerを使用することを余儀なくされています。 JComponentを何に置き換えることができますか? – Darknax

+0

@Darknaxは、答えに追加情報を追加する途中でした。 – camickr

+0

私はそれを修正しました。私がしなければならなかったのはthis.setFocusable(true)をコンストラクタに追加することでした。ありがとう! – Darknax

0

すべてのスイッチケースにbreak;を追加します。名前を変更する方法paintComponentpaint

+0

私は分かりませんが、 'paint'メソッドのソースを見ると、' paintComponent'メソッドがconditionの下にあることが分かります。クラスは 'paintComponent'を直接呼び出すことはできません(保護されているため)。方法。多分ここに問題があった – ZhenyaM

関連する問題