我正在研究事件处理并执行以下操作:
创建了一个没有任何组件的JFrame
我重写了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 :(得分:1)
在向revalidate
JFrame
this.add(bt);
revalidate();
repaint();
revalidate
重新验证组件层次结构,以便考虑可能已添加的任何新组件。
KeyListeners
对于Swing应用程序效果不佳,因为KeyEvents
需要专注才能工作。
这就是为什么在Swing中最好使用Key Bindings,即使组件没有焦点,也可以将Action映射到KeyStroke。
答案 1 :(得分:1)
,没有任何东西被添加到框架中,
将组件添加到框架中。问题是它的大小为(0,0),所以没有什么可以画的
然而,当我调整框架窗口大小时按下键后,按钮从框架中的任何位置出来
调用布局管理器,并根据布局管理器的规则为组件指定大小和位置。所以现在你看到了组件。
将组件添加到可见GUI时,代码为:
panel.add(...);
panel.revalidate();
panel.repaint();