我用SWING 做了一个画图  
已经实现了对 Jpanel 中图形的  上 下 左 右 移动(通过键盘 上下左右)
但是问题出现,在包裹 jpanel的jscrollpane 也会响应 上下左右
如何能不让JScrollPane 响应键盘时间呢/?比较急,谢谢!~

解决方案 »

  1.   

    public class MyFrame extends JFrame { private JPanel contentPane; /**
     * Launch the application.
     */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    public void run() {
    try {
    MyFrame frame = new MyFrame();
    frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    } /**
     * Create the frame.
     */
    public MyFrame() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 591, 423);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(new BorderLayout(0, 0)); JScrollPane scrollPane = new JScrollPane();
    contentPane.add(scrollPane, BorderLayout.CENTER); MyPanel panel = new MyPanel();
    scrollPane.setViewportView(panel);
    }
    }
    public class MyPanel extends JPanel implements KeyListener, MouseListener,
    MouseMotionListener { private Shape sp = new Shape(); public MyPanel() {
    setBackground(Color.white);
    setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    setPreferredSize(new Dimension(1024, 768)); addMouseListener(this);
    addMouseMotionListener(this);
    addKeyListener(this);
    } @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    // 反锯齿
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    sp.draw(g2);
    } @Override
    public void keyPressed(KeyEvent e) { // 让panel获得焦点 可以响应 键盘事件
    requestFocus();
    sp.move(e);
    System.out.println("MyPanel.keyPressed()");
    repaint();
    } @Override
    public void keyReleased(KeyEvent e) { // 让panel获得焦点 可以响应 键盘事件
    requestFocus();
    System.out.println("MyPanel.keyReleased()");
    } @Override
    public void keyTyped(KeyEvent e) { // 让panel获得焦点 可以响应 键盘事件
    requestFocus();
    System.out.println("MyPanel.keyTyped()");
    } @Override
    public void mouseClicked(MouseEvent e) {
    // 让panel获得焦点 可以响应 键盘事件
    requestFocus();
    } @Override
    public void mouseEntered(MouseEvent e) {
    } @Override
    public void mouseExited(MouseEvent e) {
    } @Override
    public void mousePressed(MouseEvent e) {
    } @Override
    public void mouseReleased(MouseEvent e) {
    } @Override
    public void mouseDragged(MouseEvent e) {
    } @Override
    public void mouseMoved(MouseEvent e) {
    }
    }class Shape {
    private Ellipse2D.Double ellipse = new Ellipse2D.Double(200, 100, 80, 50); public void draw(Graphics2D g) {
    g.draw(ellipse);
    } public void move(KeyEvent e) {
    switch (e.getKeyCode()) {
    case KeyEvent.VK_RIGHT:
    ellipse.x += 5;
    break;
    case KeyEvent.VK_DOWN:
    ellipse.y += 5;
    break;
    case KeyEvent.VK_LEFT:
    ellipse.x -= 5;
    break;
    case KeyEvent.VK_UP:
    ellipse.y -= 5;
    break;
    }
    }
    }
      

  2.   

    我重做了一个简单的demo出来,大家帮我想想办法啊, 
     按键盘上下左右的时候,图形是动了,
    但是滚动条也动了,
    我在对图形做操作的时候,不想对滚动条进行操作
    .......所以想屏蔽 滚动条 对键盘的响应PS:我DEBUG过,是图像先响应 键盘,然后是 滚动条....谢谢啊!~!
      

  3.   


    public MyFrame() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 591, 423);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(new BorderLayout(0, 0)); JScrollPane scrollPane = new JScrollPane();
    contentPane.add(scrollPane, BorderLayout.CENTER); MyPanel panel = new MyPanel();
    scrollPane.setViewportView(panel);
    scrollPane.setEnabled(false);
    }
      

  4.   

    code中显示不出颜色。。代码最后一行添上即可。
      

  5.   


    你这样是不是,直接让JScrollPane不能用了,如果别人要用鼠标拖动怎么办
      

  6.   

    可以按照下面这么用,能解决你的问题,但不保证不带出其他问题。
    在scrlpn上获取它所有的MouseListeners,然后逐个removeMouseListener。
      

  7.   

    不好意思没看清,是KeyListener。
      

  8.   

    6# 正解啊!!!~~~ 非常感谢 给你分分[email protected]  我的邮箱,能发我一下你的联系方式么? 
    以后关于SWING的方面,可以与你讨论一下~ 呵呵