关于组件如何获得焦点问题

我的观点:要使某组件获得焦点,必须先使组件所在的框架设置为可见,才能有效。

 

验证(实践中遇到的问题):

程序功能:画图形元素

程序结构:DoodlePa.java  Doodle1.java

先贴出组件类DoodlePa的实现:

DoodlePad.java

import java.awt.Color; import java.awt.Graphics; import java.awt.event.*; import java.util.ArrayList; import javax.swing.JComponent; public class DoodlePad extends JComponent { private ArrayList<DoodleShape> shapeList = new ArrayList<DoodleShape>(); private int shapeType; private Color shapeColor; DoodleShape curShape; public DoodlePad() { shapeType = DoodleShape.TRIANGLE; shapeColor = Color.black; addMouseListener(new MouseHandler()); addMouseMotionListener(new MouseMotionHandler()); addKeyListener(new KeyHandler()); } public void paint(Graphics g) { if (curShape != null) { curShape.draw(g); } for (int i = 0; i < shapeList.size(); i++) { shapeList.get(i).draw(g); } } class MouseHandler extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { curShape = new DoodleShape(shapeType, e.getPoint(), e.getPoint(), shapeColor); } @Override public void mouseReleased(MouseEvent e) { curShape.setEnd(e.getPoint()); shapeList.add(curShape); repaint(); } } class MouseMotionHandler extends MouseMotionAdapter { @Override public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); g.setXORMode(Color.white); curShape.draw(g); curShape.setEnd(e.getPoint()); curShape.draw(g); //or: 会闪 //curShape.setEnd(e.getPoint()); //repaint(); } } class KeyHandler extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_SPACE: ++shapeType; if (shapeType > DoodleShape.OVAL) { shapeType = DoodleShape.LINE; } break; case KeyEvent.VK_R: shapeColor = Color.red; break; case KeyEvent.VK_B: shapeColor = Color.black; break; default: break; } } } } 

以下为程序主框架(Doodle1类):

import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; public class Doodle1 extends JFrame { private DoodlePad pad; public Doodle1() { super("Doodle1"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); pad = new DoodlePad(); getContentPane().add(pad); pad.requestFocusInWindow(); //problem here: cannot get focus } public static void main(String[] args) { Doodle1 app = new Doodle1(); app.setSize(400, 400); app.setVisible(true); } }  

发现的问题:pad无法获得焦点,输出结果总是为false。画图时不响应键盘的输入。

通过在网上搜索,发现在1991年,老外就遇到同样的问题了(http://www.codeguru.com/forum/archive/index.php/t-31997.html),跟贴的一个仁兄给出了他的解答:组件所在的Frame必须先设置为可见,requestFocusInWindow才会起作用。在构造器中是不可能获得焦点的。

于是我对Doodle1进行了改写,果然可以获得焦点了:

import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; public class Doodle1 extends JFrame { public Doodle1() { super("Doodle1"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { Doodle1 app = new Doodle1(); DoodlePad pad = new DoodlePad(); app.setSize(400, 400); app.setVisible(true); app.getContentPane().add(pad); pad.requestFocusInWindow(); } }

结论:我的观点得到验证了哇~

你可能感兴趣的:(框架,String,Class,import,图形,jcomponent)