首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在初始化期间,我可以添加一个ComponentListener,这样它就不会触发componentResized了?

在初始化期间,我可以添加一个ComponentListener,这样它就不会触发componentResized了?
EN

Stack Overflow用户
提问于 2015-09-11 21:55:43
回答 1查看 471关注 0票数 2

我认为,答案是,在完成了所有初始组件的调整之后,但是看看这个SSCCE:

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test2 {

  private static void createAndShowGUI2() {

    final JFrame frame = new JFrame("Test2");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton addSecondListener = new JButton("Click me to add a second listener");
    addSecondListener.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        frame.addComponentListener(new ComponentAdapter() {
          public void componentResized(ComponentEvent e) {
            System.out.println("Component Listener 2");
          }
        });
      }
    });

    frame.getContentPane().add(addSecondListener);

    frame.setSize(200, 200);
    frame.setVisible(true);

    frame.addComponentListener(new ComponentAdapter() {
      public void componentResized(ComponentEvent e) {
        System.out.println("Component Listener 1");
        //throw new NullPointerException("Just getting traceback...");
      }
    });

  }

  public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI2();
      }
    });
  }
}

尽管组件侦听器1是在调整帧的大小并使其可见后添加的,但在启动java Test2时会调用一个调整大小的事件;它将首先打印Component Listener 1

这使我最初相信,添加组件侦听器总是会导致一个调整大小的事件立即触发。然而,情况并非如此。如果您按下框架组件侦听器2中的JButton,您将不会像您所做的那样正确地看到它的打印Component Listener 2,相反,只有当您调整帧的大小时,它才会触发。

是什么导致组件监听器在设置可见之前就对框架进行了调整?我在那里抛出了一个异常,查看跟踪(目前已注释掉)给了我一些提示:

代码语言:javascript
复制
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Just getting traceback...
    at Test2$2.componentResized(Test2.java:31)
    at java.awt.Component.processComponentEvent(Component.java:5960)
    at java.awt.Component.processEvent(Component.java:5914)
    at java.awt.Container.processEvent(Container.java:2023)
    at java.awt.Window.processEvent(Window.java:1816)
    at java.awt.Component.dispatchEventImpl(Component.java:4501)
    at java.awt.Container.dispatchEventImpl(Container.java:2081)
    at java.awt.Window.dispatchEventImpl(Window.java:2458)
    at java.awt.Component.dispatchEvent(Component.java:4331)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

对于我的应用程序,我想添加一个ComponentListener,因为所有初始调整都是以编程方式设置的,而不触发componentResized (直到用户实际更改了框架/组件的大小)。我怎么能这么做?

编辑:我知道有一些方法可以解决这个问题,比如添加一个最初为false的布尔值,然后设置它,以忽略第一个调整大小的事件。然而,在我看来,这并不是超级强健,我只是想知道发生了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-11 22:14:54

您可以在SwingUtilities.invokeLater()中添加侦听器,以确保在添加侦听器之前首先调整帧大小(我不认为这是一个解决办法):

代码语言:javascript
复制
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        frame.addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                System.out.println("Component Listener 1");
            }
        });
    }
});
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32532686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档