2013-09-01 99 views
2

我正在教授自己使用教科書進行Java編程。練習會要求您:使用箭頭鍵繪製線條並在重新繪製每個新線條時添加

編寫一個使用箭頭鍵繪製線段的程序。如圖16.22所示,當按下右箭頭鍵,上箭頭鍵,左箭頭鍵或下箭頭鍵時,線條從框架的中心開始向東,北,西或南方延伸。 C。

圖16.22c顯示了一個框架,其中一條實線沿用戶按下的任一箭頭鍵的方向流動。每按一次方向鍵,該線就會按照箭頭鍵的方向延伸。

我已經得到了繪製一條線的單個迭代,但是當我按下箭頭鍵時,原始線消失並繪製了一條新線。我知道它爲什麼這樣做。我想我知道如何解決它。我正在考慮將每個lint迭代添加到數組中(以及相應的點)。我還沒有做到這一點,因爲它需要重寫至今。

我想我可能會錯過一些關於圖形的知識,可以幫助我在沒有數組的情況下執行任務。如果有更簡單的方法,有人可以向我解釋。

這裏是我到目前爲止的代碼:

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 

public class DrawLinesWithArrowKeys extends JFrame { 
    DrawLinesPanel panel = new DrawLinesPanel(); 

    /** Constructor */ 
    public DrawLinesWithArrowKeys() { 
     add(panel); 
     panel.setFocusable(true); 
    } 

    /** Main Method */ 
    public static void main(String[] args) { 
     JFrame frame = new DrawLinesWithArrowKeys(); 
     frame.setTitle("Draw Lines With Arrow Keys"); 
     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    /** Inner class Draw Lines Panel */ 
    private class DrawLinesPanel extends JPanel { 
     private int x1Offset = 0; 
     private int x2Offset = 0; 
     private int y1Offset = 0; 
     private int y2Offset = 0; 

     /* Constructor */ 
     public DrawLinesPanel() { 
      addKeyListener(new KeyAdapter() { 
       @Override 
       public void keyPressed(KeyEvent e) { 
       if (e.getKeyCode() == KeyEvent.VK_UP) { 
        y1Offset = y2Offset; 
        x1Offset = x2Offset; 
        y2Offset -= 10; 
        repaint(); 
       } 
       else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
        y1Offset = y2Offset; 
        x1Offset = x2Offset; 
        y2Offset += 10; 
        repaint(); 
       } 
       else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
        x1Offset = x2Offset; 
        y1Offset = y2Offset; 
        x2Offset -= 10; 
        repaint(); 
       } 
       else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
        x1Offset = x2Offset; 
        y1Offset = y2Offset; 
        x2Offset += 10; 
        repaint(); 
       } 
       } 
      }); 
     } 

     /* Paint line */ 
     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      g.drawLine(computeXOne(), computeYOne(), computeXTwo(), computeYTwo()); 
     } 

     private int computeXOne() { 
      return (getWidth()/2) + x1Offset; 
     } 

     private int computeXTwo() { 
      return (getWidth()/2) + x2Offset; 
     } 

     private int computeYOne() { 
      return (getHeight()/2) + y1Offset; 
     } 

     private int computeYTwo() { 
     return (getHeight()/2) + y2Offset; 
     } 
    } 
} 

回答

2

累積您的積分在Shape,如PolygonGeneralPath,看到here。您可以draw()當前形狀在您的執行paintComponent()。作爲KeyListener的替代方法,請使用密鑰綁定,如here所示。