2012-07-12 75 views
2

我有一個Jpanel(p),一個Jframe(f)和這個標籤(cursorlbl),我想通過箭頭鍵移動。我已經完成了我認爲在goLeft()方法中是明智的...但它不起作用。Java Swing&Key Binding - 重繪我的光標

我在這個類的頂部有一個名爲cursx的靜態代碼,並且代碼在main中。有一個名爲cursorlbl的ImagIcon的JLabel - 我聲明它是最終的,所以我的keybind函數可以看到它。

每當我按左方向鍵,我想cursorlbl現在走開,我TableLayout在出現一個空間(從http://java.sun.com/products/jfc/tsc/articles/tablelayout

,作爲一個大的塊我會後如下圖,我嘗試通過此:

  p.remove(cursorlbl); 
      cursx++; //static var im using to keep track of the cursor 
      p.revalidate(); 
      p.repaint(); 
      p.add(cursorlbl, Integer.toString(cursx) +" ," + Integer.toString(cursy)); 
      p.revalidate(); 
      p.repaint(); 

但是,這似乎並沒有坐在我的面板。 GUI不會更新到正確的位置 - 我不知道爲什麼。

這是我的代碼更大的一塊。

final ImageIcon cursor = new ImageIcon("cursor.gif"); 
    final JLabel cursorlbl = new JLabel("", cursor, JLabel.CENTER); 
    p.add(cursorlbl, Integer.toString(cursx) +" ," + Integer.toString(cursy)); 
    p.revalidate(); 
    p.repaint(); 
    f.setVisible(true); 


    Action goRight = new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.out.println("right"); 
      //p.remove(cursorlbl); 
      //p.revalidate(); 
      //p.repaint(); 


     } 
    }; 
    Action goLeft = new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      cursx++; 
      p.remove(cursorlbl); 
      p.revalidate(); 
      p.repaint(); 
      p.add(cursorlbl, Integer.toString(cursx) +" ," + Integer.toString(cursy)); 
      p.revalidate(); 
      p.repaint(); 

     } 
    }; 


     p.setFocusable(true); 
     p.getInputMap().put(KeyStroke.getKeyStroke("RIGHT"), 
       "pressed right"); 
     p.getInputMap().put(KeyStroke.getKeyStroke("LEFT"), 
       "pressed left"); 
     p.getInputMap().put(KeyStroke.getKeyStroke("UP"), 
       "pressed up"); 
     p.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), 
       "pressed down"); 
     p.getActionMap().put("pressed right", goRight); 
     p.getActionMap().put("pressed left", goLeft); 
     p.getActionMap().put("pressed up", goUp); 
     p.getActionMap().put("pressed down", goDown); 
+0

我們能否看到tablelayout? – MadProgrammer 2012-07-12 20:14:41

回答

3

我認爲這是在TableLayout經理的錯誤。

一種解決方法是創建一個新的標籤,要更新(像這樣),每次添加到您的面板:

Action goLeft = new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     cursx--; 
     contentArea.remove(cursorlbl); 
     cursorlbl = new JLabel("",cursor, JLabel.CENTER); 
     contentArea.add(cursorlbl, Integer.toString(cursx) +" ," + Integer.toString(cursy)); 
     contentArea.revalidate(); 
     contentArea.repaint(); 
    } 
}; 

你能夠重複使用,節省您的一個很好的量ImageIcon開銷 - 但我不會將其歸類爲永久性解決方案(因爲它會創建超過必需的對象)

0

對不起,我錯過了閱讀,並認爲你試圖移動你的鼠標。

在Java API中有一個叫做Robot的類。它有一個名爲mouseMove(int x,int y)的方法。你可能想用它來移動鼠標。

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Robot.html

+0

啊,我想我可能會誤導 - 「光標」是我的JLabel的名稱,它是一個不同的上下文中的光標。對於這個問題,我不想移動鼠標光標 - 我想移動我的JLabel稱爲光標。 – PinkElephantsOnParade 2012-07-12 18:43:35