2014-04-17 2 views
1

현재 필자의 KeyEvent에서 내 사각형의 위치를 ​​업데이트하려고하지만 다른 클래스에서의 paintComponent 메소드를 호출하는 방법 또는이자바 JFrame의 페인트

페인트 클래스를 달성하는 방법을 잘 모릅니다

package com.raggaer.frame; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 

import javax.swing.JPanel; 

public class Elements extends JPanel { 

    public Elements() { 


    } 

    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     g.drawRect(250, 250, 10, 10); 
    } 

    public Dimension getPreferredSize() { 

     return new Dimension(500, 500); 
    } 
} 

그리고 내 리스너 클래스

package com.raggaer.frame; 

import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class Listener implements KeyListener { 

    public void keyPressed(KeyEvent e) { 

     System.out.println(e.getExtendedKeyCode()); 
    } 

    public void keyReleased(KeyEvent e) { 



    } 

    public void keyTyped(KeyEvent e) { 

    } 

    public void paintComponent(Graphics g) { 

     g.drawRect(10, 10, 20, 20); 
    } 
} 

나는 paintComponent에라는 리스너 클래스 내부의 방법을 추가하는 시도하지만 이것을 달성하는 방법을 알고 .. 그래픽 객체를 해달라고 전달해야합니다.

변수를 사용하여 직사각형을 그릴 생각하고 그 변수를 수정하는 keyevent하지만 그것을 할 올바른 방법이 있는지 모르겠다.

답변

2

권장 사항 :

  • 직접 페인트 또는의 paintComponent를 호출하지 않습니다.
  • 다른 클래스의 paintComponent를 사용하면 아무 것도 사용할 수 없습니다.
  • 그리는 사각형을 이동하려면 하드 코드 된 번호를 사용하지 마십시오. 변경할 수있는 필드를 사용하십시오. 따라서 g.drawRect(250, 250, 10, 10); 대신 g.drawRect(rectX, rectY, rectW, rectH);이 있어야합니다. 을 수정하십시오. 자신이 제안한대로 "I was thinking on drawing a rectangle using variables and at keyevent modify that variables but I dont know if thats the correct way to do it."
  • 이 JPanel 클래스에이 필드와 public setter 메서드를 추가하면 다른 클래스에서 필드 상태를 변경하고 repaint를 호출 할 수 있습니다. 즉, setRectX(int rectX), setRectY(int rectY), 등등 ... 일반적으로 트리거 그림 메커니즘이 그림 순서를 시작하는 것입니다 도면 JPanl에 다시 칠하고, 이것이 JPanel의의의 paintComponent 방법 (간접적으로) 호출 호출
  • .
  • KeyListener를 피할 수 있으면 사용하지 말고 Key Bindings을 사용하십시오. 이것들을 사용하는 예제 프로그램은 here으로하십시오.
+0

왜 KeyBinding을 사용하는 것이 더 좋습니까? –

+1

@AlvaroCarvajalNakosmai : [KeyListener Tutorial] (http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html)에 따라 : ""특정 키에 대한 특수 반응을 정의하려면 a 대신 키 바인딩을 사용하십시오. "Key Bindings는 KeyListeners의 상위 레벨 구조이며, 선택 키를 눌러 사각형을 움직이려면 이동하는 길입니다. 또한 KeyListeners와 마찬가지로 포커스 문제에 대해 그렇게 걱정할 필요가 없습니다. –