【问题标题】:Java 7 resize a JFrame (my GUI): the componentListener is not getting firedJava 7 调整 JFrame 的大小(我的 GUI):componentListener 没有被触发
【发布时间】:2013-09-12 20:55:42
【问题描述】:

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

我有一个 JFrame 作为 GUI 并设置了一个类似的 componentListener

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

在 componentListener 中,我有 componentResized 等...

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

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

我尝试了一些 StackOverflow 中的替代方案以编码方式,但没有办法让它工作。

当我最小化 GUI 窗口并恢复它时,会调用“componentResized”。

任何人都知道发生了什么以及为什么它在 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 下运行时,您会收到“Window Resized: Frame”消息。
同样在 Java 7 下运行,完全没有消息。

以下是图片的 2 个链接:

  • Java 6

Java 6 Frame Image

  • Java 7

Java 7 Frame Image

【问题讨论】:

  • 不知道在说什么,为了更好的帮助,请尽快发布SSCCE,简短,可运行,可编译,大约上午问题
  • 发布的代码对我使用 JDK7 和 Windows 7 来说效果很好。
  • camickr,感谢您的测试...您使用的是什么版本的JDK7?

标签: java swing resize jframe componentlistener


【解决方案1】:
  • 您的代码(在移除镇流器之前,已更改为标准代码)对我来说可以正常工作

  • 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();
            }
        });
    }
}

【讨论】:

  • @JS1970 this 可能有问题。无论如何,解释器可能拼错,而不是 Java7 问题,肯定有其他问题,code for testing purposes >=Java5
  • 谢谢你的帖子,我试过了,在我的笔记本上,它和我发布的问题一样。我不知道为什么...如果它对您有用,通常也应该对我有用...顺便说一句,我使用的是 jdk 1.7.0_25,您使用的是什么版本??
  • 我想我的电脑可能发生了一些不同的事情,我会尝试删除旧的 JVM 看看会发生什么。
  • 我的电脑肯定有问题,因为我让它在另一个 Windows 7 和 OpenSUSE 上运行
  • 可能是错误,please to see this thread
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2013-02-23
相关资源
最近更新 更多