http://expert.csdn.net/Expert/topic/2079/2079512.xml?temp=.3699304
mvc框架
应该还是焦点没有获取!
在Frame中!
//getContentPane().add(toolBar, BorderLayout.NORTH);
还有加入视图的语句!
如果去掉toolBar,只加视图就运行正常,但是两个都加!则不能运行键盘事件!
简单说就是!
就是在一个Frame中加入了JComponent(内有键盘事件),和3个JToolBar
如果不加JToolBar则程序正常!
否则键盘事件不执行,但同时鼠标事件一直运行正常!
楼主你是在向我们求助,还是在自言自语啊???
up
试试用myJComponent.setFocusable(true);
Jcomponent没有setFoucusable()这个方法
但java.awt.Component有,
而Jcomponent是java.awt.Component的子类,可以在Jcomponent中用.
你加上试试先,不行再把其他的乱七八糟的都去掉再试.
试了一下,没响应键盘事件是因为焦点首先停在Jcomponent前面的组建上.按Tab键切换到Jcomponent组件上就可以响应了.
下面是代码.按2次Tab键后即可打印出键盘事件.
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Sketch {
public static void main(String[] args) {
SketchFrame frame = new SketchFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
A frame with a panel for sketching a figure
*/
class SketchFrame
extends JFrame {
SketchPanel panel = new SketchPanel();
JPanel jToolPane = new JPanel();
JToolBar tb1 = new JToolBar();
JToolBar tb2 = new JToolBar();
public SketchFrame() {
setTitle("Sketch");
setSize(WIDTH, HEIGHT);
// add panel to frame
Container contentPane = getContentPane();
tb1.add(new JButton("toolBar1"));
tb2.add(new JButton("toolBar2"));
jToolPane.add(tb1);
jToolPane.add(tb2);
contentPane.add(jToolPane, BorderLayout.NORTH);
contentPane.add(panel, BorderLayout.CENTER);
panel.setFocusable(true);
}
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
}
/**
A panel for sketching with the keyboard.
*/
class SketchPanel
extends JComponent {
private JTextArea ta = new JTextArea();
public SketchPanel() {
this.setLayout(new BorderLayout());
this.add(new JScrollPane(ta));
ta.setEditable(false);
KeyHandler listener = new KeyHandler();
addKeyListener(listener);
}
public void addText(String text) {
ta.append(text);
}
// public boolean isFocusTraversable()
// {
// return true; // allow panel to get input focus
// }
private class KeyHandler
implements KeyListener {
public void keyPressed(KeyEvent event) {
int keyCode = event.getKeyCode();
char c = (char) keyCode;
addText("---- keyPressed: " + c + "\tkeyCode: " + keyCode + "\n");
System.out.println(keyCode);
// set distance
}
public void keyReleased(KeyEvent event) {}
public void keyTyped(KeyEvent event) {
char keyChar = event.getKeyChar();
}
}
}
楼主有魅力,有没有男朋友?
如果不想按tab键,设计上就存在问题.
Jcomponent上的键盘事件,当然只能在Jcomponent有焦点的时候才响应!
例如:Jcomponent是一个画板,已经选定了画板中的一条直线并复制到了剪贴板中.Jcomponent中有键盘事件"Ctrl+V"粘贴操作,这时候你在Jcomponent上的另一个对话框中进行操作(即Jcomponent失去焦点),你想用Ctrl+C和Ctrl+v在对话框中的几个JTextField中进行操作,会有什么后果?