0

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

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

2 回答 2

1

,没有任何东西被添加到框架中,

该组件已添加到框架中。问题是它的大小为 (0, 0) 所以没有什么可以画的

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

布局管理器被调用,组件根据布局管理器的规则被赋予一个大小和位置。所以现在你看到了组件。

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

panel.add(...);
panel.revalidate();
panel.repaint();
于 2013-05-24T17:12:36.963 回答
1

您需要revalidate在添加组件后调用JFrame

this.add(bt);
revalidate();
repaint();

revalidate重新验证组件层次结构以说明可能已添加的任何新组件。


KeyListeners不适用于 Swing 应用程序,因为KeyEvents需要专注才能工作。这就是为什么在 Swing 中最好使用键绑定,即使组件没有焦点,也可以将动作映射到 KeyStroke。

于 2013-05-24T17:12:06.677 回答