我用SWING 做了一个画图
已经实现了对 Jpanel 中图形的 上 下 左 右 移动(通过键盘 上下左右)
但是问题出现,在包裹 jpanel的jscrollpane 也会响应 上下左右
如何能不让JScrollPane 响应键盘时间呢/?比较急,谢谢!~
已经实现了对 Jpanel 中图形的 上 下 左 右 移动(通过键盘 上下左右)
但是问题出现,在包裹 jpanel的jscrollpane 也会响应 上下左右
如何能不让JScrollPane 响应键盘时间呢/?比较急,谢谢!~
* 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;
}
}
}
按键盘上下左右的时候,图形是动了,
但是滚动条也动了,
我在对图形做操作的时候,不想对滚动条进行操作
.......所以想屏蔽 滚动条 对键盘的响应PS:我DEBUG过,是图像先响应 键盘,然后是 滚动条....谢谢啊!~!
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);
}
你这样是不是,直接让JScrollPane不能用了,如果别人要用鼠标拖动怎么办
在scrlpn上获取它所有的MouseListeners,然后逐个removeMouseListener。
以后关于SWING的方面,可以与你讨论一下~ 呵呵