2014-03-29 3 views
1

키 입력에 응답하기 위해 KeyListener를 설정하려고합니다. 이미 mouselistener를 설정했지만 어떤 이유로 키 입력이 키보드 입력에 응답하지 못합니다.KeyHandler가 키 이벤트에 응답하지 않습니다.

KeyListener를 구현하고 함수를 재정의하는 클래스를 만들었습니다. 그런 다음 새 클래스의 인스턴스를 만들고 JPanel 및 JFrame에 처리기를 추가했습니다. 여전히 주사위

public class main_program extends JFrame { 

    private int mX_cord, mY_cord,prior_selected_vertex, current_selected_vertex; 
    private int verticies_to_edge1, verticies_to_edge2; 
    private int radius =10; 
    private boolean vertex_selected1 = false, vertex_selected2 = false, edge_ready = false,delete_vertex_ready = false; 
    private Edge tempEdge = null; 
    private ArrayList<Integer> vertex_xcord = new ArrayList<Integer>(); 
    private ArrayList<Integer> vertex_ycord = new ArrayList<Integer>(); 
    private ArrayList<Edge> edge = new ArrayList<Edge>(); 

    HandlerMouse handler = new HandlerMouse(); 
    HandlerKey keyhand = new HandlerKey(); 

    private JPanel masterPanel; 
    private JTextArea masterTextArea; 
    private JScrollPane masterScrollPane; 
    private Point point1, point2; 
    Graphics g; 

    public main_program(){ 

     setTitle("Graph"); 
     setSize(600, 400); 
     setDefaultCloseOperation(new JFrame().EXIT_ON_CLOSE); 
     //this must be set for custom layout of components 
     setLayout(null); 

     masterPanel = new JPanel(); 
     masterPanel.setSize(600,300); 
     masterPanel.setLocation(0, 0); 
     masterPanel.setBackground(Color.WHITE); 
     masterPanel.addMouseListener(handler); 
     masterPanel.addMouseMotionListener(handler); 
     masterPanel.addKeyListener(keyhand); 

     masterTextArea = new JTextArea(); 
     masterTextArea.setBackground(Color.green); 

     masterScrollPane = new JScrollPane(); 
     masterScrollPane.add(masterTextArea); 
     masterScrollPane.setSize(600, 100); 
     masterScrollPane.setLocation(0, 300); 
     masterScrollPane.addMouseListener(handler); 
     masterScrollPane.addMouseListener(handler); 
     masterScrollPane.addKeyListener(keyhand); 

     add(masterPanel); 
     add(masterScrollPane); 
     setLocationRelativeTo(null); 
     setVisible(true); 

    } 

    public void paint(Graphics g){ 
     super.paint(g); 
     for(int i = 0 ; i < vertex_xcord.size(); i++){ 
      g.fillOval(vertex_xcord.get(i), vertex_ycord.get(i), radius, radius); 
     } 
     for(int i = 0 ; i<edge.size(); i++){ 
      tempEdge = edge.get(i); 
      g.drawLine(vertex_xcord.get(tempEdge.vertex1), vertex_ycord.get(tempEdge.vertex1), vertex_xcord.get(tempEdge.vertex2), vertex_ycord.get(tempEdge.vertex2)); 
     } 
     //g.fillOval(mX_cord, mY_cord, radius, radius); 
     //repaint(); 
    } 

    private class HandlerKey implements KeyListener{ 
     public void keyPressed(KeyEvent evt){ 
      System.out.println("key pressed"); 
      if(evt.getKeyCode() == KeyEvent.VK_ENTER && edge_ready){ 
       edge.add(new Edge(prior_selected_vertex, current_selected_vertex)); 
       edge_ready = false; 
       repaint(); 
      } 
     } 
     public void keyReleased(KeyEvent evt){ 
      System.out.println("key rel"); 
     } 
     public void keyTyped(KeyEvent evt){ 
      System.out.println("key type"); 
     } 
    } 
    private class HandlerMouse implements MouseListener, MouseMotionListener{ 

     public void mouseClicked(MouseEvent evt){ 
      mX_cord = evt.getX()-5; 
      mY_cord = evt.getY()+15; 
      if(evt.getClickCount() == 1){ 
       //mX_cord = evt.getX(); 
       //mY_cord = evt.getY(); 
       vertex_xcord.add(mX_cord); 
       vertex_ycord.add(mY_cord); 
       repaint(); 
      } 
      else{ 
       for(int i = 0 ; i < vertex_xcord.size(); i++){ 
        if(Math.abs(vertex_xcord.get(i) - mX_cord) < 15 && Math.abs(vertex_ycord.get(i) - mY_cord) < 15){ 
         if(vertex_selected1 == false){ 
          prior_selected_vertex = i; 
          vertex_selected1 = true; 
         } 
         else{ 
          current_selected_vertex = i; 
          vertex_selected2 = true; 
         } 
         System.out.println("YOU HAVE SELECTED A VERTEX: " + i); 
         break; 
        } 
       } 
      } 
      if(vertex_selected2 == true){ 
       edge_ready = true; 
       verticies_to_edge1 = prior_selected_vertex; 
       verticies_to_edge2 = current_selected_vertex ; 
       vertex_selected1 = vertex_selected2 = false; 
       System.out.println("Ready for edge!"); 
      } 
      else{ 
       delete_vertex_ready = true; 
      } 
     } 

     public void mouseEntered(MouseEvent arg0) 
     { 
     } 

     public void mouseExited(MouseEvent arg0) 
     { 
     } 

     public void mousePressed(MouseEvent evt) 
     { 
     } 

     public void mouseReleased(MouseEvent arg0) 
     { 
     } 

     public void mouseDragged(MouseEvent e) 
     { 
     } 

     public void mouseMoved(MouseEvent e) 
     { 
     } 
    } 

    class Edge { 
     int vertex1, vertex2; 
     public Edge(int v1, int v2){ 
      vertex1 = v1; 
      vertex2 = v2; 
     } 
    } 

    public static void main(String[] args){ 
     main_program circle = new main_program(); 
    } 
} 

답변

5

당신은 그 프로그램 몇 가지 문제가있어, 그것을 당신이, 스윙 Q & A의이 사이트는 많이 읽고 잘 할 거라고 제안하기 때문에 이러한 문제 (그리고 당신의 주요 문제)는 매우 일반적이며 솔루션은 종종 게시됩니다.

주요 문제에 대해서는 문제가 다시 매우 일반적입니다. KeyListeners는 청취 한 구성 요소에 포커스가있는 경우에만 작동합니다. 초점이 흐려 지거나 초점을 맞추지 못하면 운이 없어집니다. 가장 좋은 해결책은 종종 KeyListener를 사용하는 것이 아니라 더 높은 수준의보다 유연한 키 바인딩을 사용하는 것입니다. Google은이를 위해 자습서를 제공합니다.

코드와 다른 문제에 관해서는

: 당신은 널 (null) 레이아웃을 사용하고

  • , 업그레이드 및 강화하는 것은 매우 어려운 경직된 GUI 년대에 이르게 레이아웃, 그리고 그 모든하지만 현재에 끔찍한 봐 플랫폼 및 화면 해상도. 솔루션 : 레이아웃 관리자를 연구하고 사용하십시오.
  • JFrame의 paint(Graphics g) 메서드로 직접 드로잉하고 있습니다. 이렇게하면 JFrame의 구성 요소 중 일부 및 전체를 그림으로 망칠 위험이 있습니다. JPanel의 paintComponent(Graphics g) 메소드를 그리는 것이 훨씬 더 효과적이며, 자동 이중 버퍼링을 포함한 Swing (AWT보다는) 그래픽의 이점을 얻을 수 있습니다.
  • 클래스에는 Graphics 변수 (g)가 있습니다. 이는 구성 요소 또는 JVM에서 저장된 Graphics 객체를 사용하려는 것을 의미합니다. 이것에 의해, 그래픽 오브젝트가 존재하지 않게되었을 때, 또는 그래픽 오브젝트가 존재하지 않게되었을 때에, NullPointerException를 슬로우하지만, 효과는 볼 수 없게되는 일이 있습니다. 해결 방법 : paint 메서드 (JComponent의 paintComponent 메서드를 사용하는 것이 좋음) 내에서만 또는 BufferedImage의 Graphics 개체를 사용하여 그리십시오.
  • JPanel에 직접 MouseListener를 추가하고 있지만 다른 구성 요소 인 JFrame에서 드로잉하고 인세 트를 고려하지 않고 삽입하면 잘못된 위치에 점을 배치합니다. 그리는 것과 같은 컴퍼넌트상에서 MouseListener를 사용합니다.

다시 한번 말씀 드리면이 사이트에서 프로그램을 향상시키는 데 사용할 수있는 많은 보물을 찾을 수 있습니다.

+2

@ user3044571 JFrame은 KeyListener에 초점을 맞출 수 없습니다. – mKorbel

+0

@mKorbel : 좋은 점, 고마워요! –

+0

입력 해 주셔서 감사합니다. 나는 당신이 제안한 시정을 겪고 있습니다. 내가 막 다른 골목에 빠지면 내가 너 한테 연락하면 될까? 다시 한 번 감사드립니다! – user3044571

관련 문제