2014-01-15 62 views
1

我正在尝试解决使用箭头键绘制线条的练习。当按下其中一个箭头键时,该线从中心开始向东,西,北或南方延伸。代码只能在东或西方向运行,而不能在北方或南方运行,这是我的问题!如何使用箭头键绘制线条(线段)?

有人能给我一个关于这件事的想法吗?谢谢。

下面的代码:

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

public class DrawingLinesUsingTheArrowKeys extends JFrame { 

    // Create a panel 
    private LinesUsingTheArrowKeys LinesUsingTheArrowKeys = new LinesUsingTheArrowKeys(); 

    public DrawingLinesUsingTheArrowKeys() { 

     add(LinesUsingTheArrowKeys); 

     /* 
     * A component (keyboard) must be focused for its can receive the 
     * KeyEvent To make a component focusable , set its focusable property 
     * to true 
     */ 
     LinesUsingTheArrowKeys.setFocusable(true); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new DrawingLinesUsingTheArrowKeys(); 
     frame.setTitle("Drawing Lines Using The Arrow Keys"); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 200); 
     frame.setVisible(true); 
    } 

    // Inner class: LinesUsingTheArrowKeys (keyboardPanel) for receiving key 
    // input 
    static class LinesUsingTheArrowKeys extends JPanel { 
     private int x = 200; 
     private int y = 100; 
     private int x1 = x + 10; 
     private int y1 = y; 

     // register listener 
     public LinesUsingTheArrowKeys() { 
      addKeyListener(new KeyAdapter() { 
       @Override 
       public void keyPressed(KeyEvent e) { 
        if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
         // x1 += y1; 
         y1 += 10; 

         repaint(); 
        } else if (e.getKeyCode() == KeyEvent.VK_UP) { 
         y1 -= 10; 
         repaint(); 
        } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
         x1 += 10; 
         repaint(); 
        } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
         x1 -= 10; 
         repaint(); 
        } 

       } 
      }); 
     } 

     // Draw the line(s) 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      g.drawLine(x, y, x1, y1); 
     } 
    } 
} 
+3

我认为在您进一步学习之前,您可能想了解Java和JavaScript之间的区别 – MadProgrammer

+0

好的...我是所以强调了关于java中的pbm + new =发布这个问题时的一些错误......但我会照顾那个.. – Kurt16

回答

2

您的第一个错误是使用一个KeyListenerKeyListener只会在组件注册为可聚焦且具有焦点时才会响应关键事件。

你的第二个错误是没有为你的LinesUsingTheArrowKeys类提供尺寸提示,所以布局管理器对你的组件应该有多大有一些了解。

你的第三个错误是假设Swing中的绘画是准确的,但事实并非如此。在Swing中绘画是破坏性的。也就是说,每次调用paintComponent时,期望的是将清除上下文并且将完全重新生成任何需要着色的内容。

看看:

基本上,更好的解决办法是有一个ListPoint,其中paintComponent只是简单地在它们之间生成Line,或者甚至可能是某种PolygonShape。然后,您可以简单地根据需要在此List中添加一个新的Point,然后重新绘制组件

+0

谢谢你。是否有可能向我展示如何创建点列表? – Kurt16

+1

试着看看[this](https://stackoverflow.com/questions/14088470/java-challenge-on-permitting-the-user-to-draw-a-line/14088561#14088561)(它在结束的答案),[另一种可能性](https://stackoverflow.com/questions/15396258/drawpolygon-keeps-drawing-lines-from-starting-mousepressed-location-to-current/15398270#15398270) – MadProgrammer

+0

谢谢帮助。 – Kurt16