组件没有按预期添加到框架中



我正在学习事件处理,并执行了以下操作:

  • 创建一个没有任何组件的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,即使组件没有焦点。

相关内容

  • 没有找到相关文章

最新更新