Java 7 调整 JFrame 的大小(我的 GUI):组件侦听器没有被触发



我用谷歌搜索了一下,找不到答案:

我有一个 JFrame 作为 GUI 并设置了一个组件侦听器,例如

this.addComponentListener(new CL(this, logger));

在组件侦听器中,我有组件调整大小等...

public void componentResized(ComponentEvent e) {
    if (e.getSource() == gui) {
       here I do the code
    }
}

在 Java 6 下一切正常,但在 Java 7 下,Jframe 正在调整大小,但没有被重新绘制:组件侦听器没有被调用

我尝试了一些来自StackOverflow的编码方式,但没有办法让它工作。

当我最小化 GUI 窗口并恢复它时,正在调用"组件调整大小"。

任何人都知道发生了什么,以及为什么它在Java 6而不是Java 7下工作。

下面是一个示例代码:

public class Frame extends JFrame {
    private JPanel  panel;
    public Frame() {
        super();
        getContentPane().setBounds(new Rectangle(0, 0, 200, 200));
        getContentPane().setLayout(null);
        getContentPane().add(getPanel());
        this.addComponentListener(new ComponentListener() {
            @Override
            public void componentResized(ComponentEvent e) {
                System.out.println("Window Resized: Frame");}
            @Override
            public void componentMoved(ComponentEvent e) {}
            @Override
            public void componentShown(ComponentEvent e) {}
            @Override
            public void componentHidden(ComponentEvent e) {}});
        this.setSize(200, 200);
        this.setPreferredSize(new Dimension(200, 200));
        this.pack();
    }
    public JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel();
            panel.setBackground(Color.RED);
            panel.setBounds(0, 0, 200, 200);
            panel.setPreferredSize(new Dimension(200, 200));
        }
        return panel;
    }
}

这是启动类:

public class StartUp {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        Frame app = new Frame();
        app.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        app.pack();
        app.setVisible(true);
    }
}

在 Java 6 下运行时,您会收到"窗口调整大小:框架"消息。
在Java 7下运行相同,根本没有消息。

以下是2个图片链接:

  • 爪哇 6

Java 6 帧图像

  • 爪哇 7

Java 7 帧图像

  • 您的代码(在 balast 删除之前,更改为标准)对我正确工作

  • ComponentListener从每个像素触发事件

  • 这是componentResized()的基本属性,否则需要SwingTimer.restart()直到调整大小结束)

去除了底流器,改为标准

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class MyFrame {
    private JFrame frame = new JFrame();
    private JPanel panel;
    public MyFrame() {
        frame.add(getPanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        frame.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                System.out.println("Window Resized: Frame");
            }
        });
    }
    public JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(300, 200);
                }
            };
            panel.setBackground(Color.RED);
        }
        return panel;
    }
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MyFrame app = new MyFrame();
            }
        });
    }
}

最新更新