我正在学习事件处理,并执行了以下操作:
-
创建一个没有任何组件的JFrame
-
i重写了keyPressed()方法,这样每当从键盘上按下一个键时,一个按钮应该出现在框架中(通过使用add()然后调用repaint())。现在我想问的是,在键盘按下键的时候,没有任何东西被添加到框架中,但是当我调整框架窗口的大小时,按下键后,按钮从框架中无处出现....发生什么事情了?
import java.awt.*; import java.awt.event.*; import javax.swing.*; class MyFrame extends JFrame implements KeyListener { private JButton bt=new JButton(); MyFrame() { addKeyListener(this); } public void keyPressed(KeyEvent ke) { this.add(bt); repaint(); } public void keyTyped(KeyEvent ke) { } public void keyReleased(KeyEvent ke) { } } public class MyClass /*class containing the main method*/ { public static void main(String args[]) { MyFrame frm=new MyFrame(); frm.setVisible(true); frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
,没有添加到框架中,
组件被添加到框架中。问题是它的大小是(0,0)所以没有东西可以绘制
然而,当我调整框架窗口的大小时,按下键后,按钮从框架
的某处出来了。
将调用布局管理器,并根据布局管理器的规则为组件提供大小和位置。现在你看到组件了。
当你添加一个组件到一个可见的GUI代码是:
panel.add(...);
panel.revalidate();
panel.repaint();
向JFrame
添加组件后需要调用revalidate
this.add(bt);
revalidate();
repaint();
revalidate
重新验证组件层次结构,以考虑可能已添加的任何新组件。
KeyListeners
不适合Swing应用程序,因为KeyEvents
需要焦点才能工作。这就是为什么在Swing中最好使用Key Bindings,它允许你将Action映射到KeyStroke,即使组件没有焦点。