【问题标题】:component not getting added into the frame as expected组件未按预期添加到框架中
【发布时间】:2013-05-24 17:08:48
【问题描述】:

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

  • 创建了一个没有任何组件的 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 上使用repaint。请改用pack()

标签: java events event-handling


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    JFrame添加组件后需要调用revalidate

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

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


    KeyListeners 不适用于 Swing 应用程序,因为 KeyEvents 需要专注才能工作。 这就是为什么在 Swing 中最好使用Key Bindings,它允许您将 Action 映射到 KeyStroke,即使组件没有焦点。

    【讨论】:

    • 谢谢,请您解释一下 revalidate() 的使用以及为什么不使用 keyListeners...:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多