2015-08-19 42 views
-1

我是學習這個的初學者。通過畫一個三角形做測試,現在我想移動它,它不工作,所以我想問什麼是我的錯誤。對不起,它很長。 import javax.swing.JFrame; import javax.swing.JPanel;使用鍵盤箭頭和鼠標事件在Java中移動圖形

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.*; 

public class Test extends JFrame { 
private Triangle triangle; 
private final int step = 10; 
private Triangle keyboardPanel = new Triangle(); 

public static void main(String[] args) 
{ 
    Test t = new Test(); 

} 

public Test() 
{ 

    setTitle("TRY TRY TRY"); 
    setLocationRelativeTo(null); // Center the frame 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 500, 500); 

    JPanel tripanel = new JPanel(); 

    add(tripanel); 

    triangle = new Triangle(); 

    tripanel.addKeyListener(null); 
    tripanel.addMouseListener(null); 
    tripanel.addMouseMotionListener(null); 

    setVisible(true); 
} 

    static class move extends JPanel implements KeyListener,MouseListener,  MouseMotionListener{ 

    private int x = 210; 
    private int y = 210; 
    private Color color = Color.BLACK; 


    move() 
    { 

    addKeyListener(this); 
    addMouseListener(this); 
    addMouseMotionListener(this); 
    } 

    @Override 
    public void keyPressed(KeyEvent ke) { 
     int KeyCode = ke.getKeyCode(); 
     System.out.println("key code is" +KeyCode); 


     /*switch (KeyCode) 
     { 
     case KeyEvent.VK_UP: 
      triangle.moveTriangle(-10, 0); 
      break; 
     case KeyEvent.VK_DOWN: 
      triangle.moveTriangle(10, 0); 
      break; 
     case KeyEvent.VK_LEFT: 
      triangle.moveTriangle(0, -10); 
      break; 
     case KeyEvent.VK_RIGHT: 
      triangle.moveTriangle(0, 10); 
      break; 
     } 
     repaint();*/ 

    } 

    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     System.out.println("hello"); 
     x = e.getX(); 
     y = e.getY(); 
     repaint(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 

     x = e.getX(); 
     y = e.getY(); 
     System.out.println("hello123"); 
     if(e.isControlDown()) 
      color = Color.RED; 

     else 
      color = Color.BLACK; 
     repaint(); 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println(e.getPoint()); 
    } 

} 

public void paint(Graphics g) 
{ 
    super.paint(g); 
    triangle.drawTriangle(g); 
} 

public void paintComponent(Graphics g) 
{ 
    super.paintComponents(g); 
    triangle.drawTriangle(g); 
} 


} 

import java.awt.Graphics; 

import javax.swing.JPanel; 


public class Triangle { 
private Point p1; 
private Point p2; 
private Point p3; 

int numX; 
int numY; 

public Triangle() 
{ 

    p1 = new Point(200,200); 
    p2 = new Point(170,230); 
    p3 = new Point(230,230); 
} 

public void moveTriangle(int dx, int dy) 
{ 
    p1.move(dx, dy); 
    p2.move(dx, dy); 
    p3.move(dx, dy); 

} 

public void drawTriangle(Graphics g) 
{ 
    g.drawLine(p1.getX(), p1.getY(),p2.getX(),p2.getY()); 
    g.drawLine(p2.getX(),p2.getY(),p3.getX(),p3.getY()); 
    g.drawLine(p3.getX(), p3.getY(),p1.getX(),p1.getY()); 
} 
} 
public class Point { 
private int x; 
private int y; 

public Point(int X, int Y) 
{ 
    x = X; 
    y = Y; 
} 

public void setX(int X) 
{ 
    x = X; 
} 

public void setY(int Y) 
{ 
    x = Y; 
} 

public int getX() 
{ 
    return x; 
} 

public int getY() 
{ 
    return y; 
} 

public void move(int dx, int dy) 
{ 
    x +=dx; 
    y +=dy; 
} 

public String toString() 
{ 
    return("X = "+x+" Y= "+y); 
} 
} 
+2

當你說 「它不工作」 *究竟是怎麼回事?*是你得到一個錯誤:什麼錯誤?三角形是否朝錯誤的方向移動?沒有任何動作? – NoseKnowsAll

+0

我查看了這段代碼,從來沒有真正調用過'moveTriangle()'。那麼你究竟如何期望它移動呢? – NoseKnowsAll

+0

你有沒有添加移動面板? –

回答

0

您的代碼中存在很多問題。編寫代碼時總是先測試當前代碼,然後才能繼續。

您創建一個面板並添加到jframe中。

JPanel tripanel = new JPanel(); 
add(tripanel); 

但你的圖形化機制已經寫在move面板,所以你需要做出的舉動,而不是面板JPanel的。

keylistners已添加到面板,但不會觸發keylisners,因爲當關注組件時,鍵列表工作。它適用於像jtextfiled這樣的組件。但不是面板。你必須使用keybinding。我已經添加了右鍵的keybind ..你必須將它添加到其他鍵的上,下等。

也將您的paint方法從jframe移動到jpanel。

示例代碼(運行這段代碼,並按右箭頭->

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.*; 
import javax.swing.AbstractAction; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

public class Test extends JFrame { 

    private Triangle triangle; 
    private final int step = 10; 
    private Triangle keyboardPanel = new Triangle(); 

    public static void main(String[] args) { 
     Test t = new Test(); 

    } 

    public Test() { 

     setTitle("TRY TRY TRY"); 
     setLocationRelativeTo(null); // Center the frame 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 500, 500); 

     JPanel tripanel = new move(); 

     add(tripanel); 

     triangle = new Triangle(); 

     setVisible(true); 
    } 

    class move extends JPanel implements MouseListener, MouseMotionListener { 

     private int x = 210; 
     private int y = 210; 
     private Color color = Color.BLACK; 

     move() { 

      addMouseListener(move.this); 
      addMouseMotionListener(move.this); 

      this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "moveright"); 
      this.getActionMap().put("moveright", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        triangle.moveTriangle(10, 0); 
        repaint(); 
       } 
      }); 

     } 

     @Override 
     public void mouseClicked(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseEntered(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      System.out.println("hello"); 
      x = e.getX(); 
      y = e.getY(); 
      repaint(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent arg0) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 

      x = e.getX(); 
      y = e.getY(); 
      System.out.println("hello123"); 
      if (e.isControlDown()) { 
       color = Color.RED; 
      } else { 
       color = Color.BLACK; 
      } 
      repaint(); 

     } 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      // TODO Auto-generated method stub 
      //System.out.println(e.getPoint()); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      triangle.drawTriangle(g); 
     } 

    } 

    class Triangle { 

     private Point p1; 
     private Point p2; 
     private Point p3; 

     int numX; 
     int numY; 

     public Triangle() { 

      p1 = new Point(200, 200); 
      p2 = new Point(170, 230); 
      p3 = new Point(230, 230); 
     } 

     public void moveTriangle(int dx, int dy) { 
      p1.move(dx, dy); 
      p2.move(dx, dy); 
      p3.move(dx, dy); 

     } 

     public void drawTriangle(Graphics g) { 
      g.drawLine(p1.getX(), p1.getY(), p2.getX(), p2.getY()); 
      g.drawLine(p2.getX(), p2.getY(), p3.getX(), p3.getY()); 
      g.drawLine(p3.getX(), p3.getY(), p1.getX(), p1.getY()); 
     } 
    } 

    class Point { 

     private int x; 
     private int y; 

     public Point(int X, int Y) { 
      x = X; 
      y = Y; 
     } 

     public void setX(int X) { 
      x = X; 
     } 

     public void setY(int Y) { 
      x = Y; 
     } 

     public int getX() { 
      return x; 
     } 

     public int getY() { 
      return y; 
     } 

     public void move(int dx, int dy) { 
      x += dx; 
      y += dy; 
     } 

     public String toString() { 
      return ("X = " + x + " Y= " + y); 
     } 
    } 
} 

輸出>>

enter image description here

+0

這個東西,我想通過點擊形狀來選擇一個形狀。用紅色突出顯示所選形狀。在按住「shift」鍵的同時做出多個選擇。簡而言之,我想要拖放東西 – GenieMint

+0

@GenieMint你可能需要創建一個Triangle列表並添加新的字段給Triangle類。例如'boolean isActive' if你點擊一個三角形設置isActive爲true,然後調用repaint .in repaint方法檢查標誌,如果是true,則將其繪製爲讀取顏色 –