Java 组件未按预期添加到框架中

Java 组件未按预期添加到框架中,java,events,event-handling,Java,Events,Event Handling,我正在研究事件处理,并执行了以下操作: 创建了一个没有任何组件的JFrame 我重写了keyPressed()方法,这样每当从键盘按下一个键时,框架中就会出现一个按钮(通过使用add()然后调用repaint())。 现在我想问的是,在从键盘按键时,没有向帧中添加任何内容,但是在我调整帧窗口大小时按下按键后,该按钮从帧中的任何位置出现。 发生了什么事 import java.awt.*; import java.awt.event.*; import javax.swing.*; c

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

  • 创建了一个没有任何组件的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);
    
    }
     }
    

在将组件添加到
JFrame

this.add(bt);
revalidate();
repaint();
revalidate
重新验证组件层次结构,以考虑可能已添加的任何新组件


KeyListeners
对于Swing应用程序不起作用,因为
KeyEvents
需要焦点才能工作。 这就是为什么在Swing中最好使用它,它允许您将动作映射到击键,即使组件没有焦点

,没有向框架添加任何内容

该构件已添加到框架中。问题是它的大小是(0,0),因此没有任何东西可以绘制

但是,当我调整框架窗口的大小时,按下该键后,按钮从框架中的何处出现

将调用布局管理器,并根据布局管理器的规则为组件指定大小和位置。现在您看到了组件

将组件添加到可见GUI时,代码为:

panel.add(...);
panel.revalidate();
panel.repaint();

不要在
JFrame
上使用
repaint
。请尝试使用
pack()
。谢谢,请您澄清一下revalidate()的用法,以及为什么不使用keyListeners…:)