2013-11-26 71 views
0

以下是我在修復問題時遇到的問題。我無法正確使用箭頭鍵移動對象。每當我使用箭頭鍵移動屏幕上的對象時,它會移動幾個像素,然後停止。鑰匙停止工作。我正在使用eclipse編譯器。 幫助將不勝感激。 謝謝!在修復按鍵事件功能時遇到問題

import acm.program.*; 
import acm.graphics.*; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

public class Ch10_Ex06_Draw_Star_Additions extends GraphicsProgram 
{ 
    public void init() 
    { 
     slider = new JSlider (1, 150, 30); 

     box = new JComboBox (); 
     box.addItem   ("White"); 
     box.addItem   ("Black"); 
     box.addItem   ("Red"); 
     box.addItem   ("Green"); 
     box.addItem   ("Blue"); 
     box.addItem   ("Orange"); 
     box.addItem   ("Yellow"); 
     box.setEditable  (false); 
     box.setSelectedItem ("White"); 

     textField = new JTextField (20); 
     textField.addActionListener (this); 

     add (new JLabel ("Small"), SOUTH); 
     add (slider,    SOUTH); 
     add (new JLabel ("Large"), SOUTH); 
     add (new JButton ("Clear"), SOUTH); 
     add (new JLabel ("Text"), SOUTH); 
     add (textField,    SOUTH); 
     add (box,     SOUTH); 

     setBackground (Color.LIGHT_GRAY); 

     addActionListeners (); 
     addKeyListeners (); 
     addMouseListeners (); 
    } 

    public void keyPressed (KeyEvent e) 
    { 
     if (e.getKeyCode() == KeyEvent.VK_DELETE) 
      removeAll(); 

     gobj = getElementAt (X, Y); 

     if (gobj != null) 
     { 
      switch (e.getKeyCode()) 
      { 
      case KeyEvent.VK_UP:  gobj.move(0, -5); break; 
      case KeyEvent.VK_DOWN:  gobj.move(0, +5); break; 
      case KeyEvent.VK_LEFT:  gobj.move(-5, 0); break; 
      case KeyEvent.VK_RIGHT:  gobj.move(+5, 0); break; 
      } 
     } 
    } 

    public void mouseClicked (MouseEvent e) 
    { 
     X = e.getX(); 
     Y = e.getY(); 

     star = new GStar (slider.getValue()); 
     star.setFilled  (true); 
     star.setColor  (getCurrentColor()); 
     star.setFillColor (getCurrentColor()); 
     add (star, e.getX(), e.getY()); 
    } 

    public void mousePressed (MouseEvent e) 
    { 
     point = new GPoint (e.getPoint()); 
     gobj = getElementAt (point); 
    } 

    public void mouseDragged (MouseEvent e) 
    { 
     if (gobj != null) 
     { 
      gobj.move (e.getX() - point.getX(), e.getY() - point.getY()); 
      point = new GPoint (e.getPoint()); 
     } 
    } 

    public void actionPerformed (ActionEvent e) 
    { 
     if (e.getActionCommand() == "Clear") 
      removeAll(); 

     if (e.getSource() == textField) 
     { 
      GLabel label = new GLabel (textField.getText()); 
      String str = "Arial-" + slider.getValue()/2; 
      label.setColor (getCurrentColor()); 
      label.setFont(str); 
      add (label, X + star.getWidth() , Y + star.getHeight()/4); 
     } 
    } 

    private Color getCurrentColor() 
    { 
     String name = (String) box.getSelectedItem(); 
      if (name == "Red")  return Color.RED; 
     else if (name == "Green") return Color.GREEN; 
     else if (name == "Blue") return Color.BLUE; 
     else if (name == "Orange") return Color.ORANGE; 
     else if (name == "Yellow") return Color.YELLOW; 
     else if (name == "Black") return Color.BLACK; 
     else      return Color.WHITE; 
    } 

    private JTextField textField; 
    private JSlider  slider; 
    private JComboBox box; 
    private GObject  gobj; 
    private GPoint  point; 
    private GStar  star; 
    private int   X, Y; 
} 

回答

0

您的對象正在遠離「X」和「Y」範圍,這些範圍僅在單擊某個對象時纔會獲得。您應該在單擊過程中將由getElementAt(X,Y)返回的對象保存到成員變量中,比如selectedObject,然後使用它來移動它。

+0

嗨,謝謝你回覆我的文章,但我不確定你想說什麼。你能寫出2-3行代碼來解釋我嗎?幫助將不勝感激! –

+0

我可以看到你正在保存mouseClicked事件中的X和Y值。現在當你按下箭頭鍵(比如右箭頭)時,每次調用處理程序時,方法getElementAt(X,Y)都會返回最後一次單擊位置的對象(不一定是最後一次單擊的對象)並將其移動到對。這重複了幾次。那麼會發生什麼事情是對象的位置移動太多,以致它不在(X,Y)中。所以getElementAt(X,Y)不會返回任何東西。所以gobj是null。我希望你現在明白。 – Raze