2014-03-29 46 views
1

我想設置一個KeyListener來響應我的擊鍵。我已經設置了一個mouselistener,但由於某種原因,我無法讓鍵盤記錄器響應任何按鍵。KeyHandler沒有響應keyevents

我創建了一個實現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,而是使用更高級別和更靈活的Key Bindings。谷歌會爲你找到這個教程。

至於其他問題,你的代碼:

  • 您使用空佈局,導致僵化GUI的是升級,提升非常困難的佈局,並期待所有,但當前的可怕平臺和屏幕分辨率。解決方案:學習和使用佈局管理器。
  • 您正在直接繪製到JFrame的paint(Graphics g)方法中,該方法存在風險,因爲這樣做可能會弄亂任何和所有JFrame的構成元素的繪製。更好地繪製JPanel的paintComponent(Graphics g)方法,並獲得包括自動雙緩衝在內的Swing(而不是AWT)圖形的好處。
  • 您的類有一個Graphics變量g,這表明您正在考慮使用來自組件或來自JVM的存儲的Graphics對象。當Graphics對象不再存在時,這增加了程序拋出NullPointerException的風險,或者是用它繪圖而沒有看到任何效果。解決方案:只繪製繪畫方法(再次使用JComponent的paintComponent方法)或使用BufferedImage中的Graphics對象。
  • 您正在將一個MouseListener直接添加到JPanel中,但正在繪製不同的組件(即JFrame),並且通過這樣做而不考慮插入,將點放在錯誤的位置。在您繪製的相同組件上使用MouseListener。

再次,請看看這裏,因爲我認爲你會發現這個網站上的許多寶藏可以用來增強你的程序。

+2

@ user3044571 JFrame不適用於KeyListener – mKorbel

+0

@mKorbel:很好,謝謝! –

+0

感謝您的意見。我正在通過並進行您提出的更正。如果我陷入死衚衕,你介意我是否與你聯繫?再次感謝! – user3044571