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;
}
嗨,謝謝你回覆我的文章,但我不確定你想說什麼。你能寫出2-3行代碼來解釋我嗎?幫助將不勝感激! –
我可以看到你正在保存mouseClicked事件中的X和Y值。現在當你按下箭頭鍵(比如右箭頭)時,每次調用處理程序時,方法getElementAt(X,Y)都會返回最後一次單擊位置的對象(不一定是最後一次單擊的對象)並將其移動到對。這重複了幾次。那麼會發生什麼事情是對象的位置移動太多,以致它不在(X,Y)中。所以getElementAt(X,Y)不會返回任何東西。所以gobj是null。我希望你現在明白。 – Raze