gpt4 book ai didi

java - 在初始化过程中,什么时候可以添加一个 ComponentListener,这样它就不会触发 componentResized?

转载 作者:行者123 更新时间:2023-11-30 06:12:47 24 4
gpt4 key购买 nike

我认为答案是在完成所有初始组件大小调整之后,但请看一下这个 SSCCE:

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

这最初让我相信添加组件监听器总是会导致调整大小事件立即触发。然而,这种情况并非如此。如果您按下框架内的 JButton,组件监听器 2 将被添加,并且您不会像您那样正确地看到它的打印 Component Listener 2,相反它只会在您调整框架大小时触发。

是什么导致组件监听器在框架设置为可见之前就已经调整大小之后触发?我在那里抛出异常以查看回溯(当前已注释掉)给我一些提示:

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 并随后设置的 boolean 值,以忽略第一个调整大小事件。然而,这在我看来并不是 super 强大,我只想知道发生了什么。

最佳答案

您可以在 SwingUtilities.invokeLater() 中添加监听器,以确保在添加监听器之前先调整框架的大小(我不认为这会被视为解决方法):

SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
System.out.println("Component Listener 1");
}
});
}
});

关于java - 在初始化过程中,什么时候可以添加一个 ComponentListener,这样它就不会触发 componentResized?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32532686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com