陷阱最大化事件并获得新的帧宽度

时间:2014-12-15 16:20:11

标签: java swing

我试图用Java做到这一点:

public class Fram extends JFrame{
     public void init(){

        addWindowStateListener(new java.awt.event.WindowStateListener() {
            public void windowStateChanged(java.awt.event.WindowEvent evt) {
                wsc(evt);
            }
        });

    }
    private void wsc(java.awt.event.WindowEvent evt) {                     

        System.out.println(evt.getNewState() == Frame.MAXIMIZED_BOTH);
        System.out.println(this.getWidth());
    }                    
}

输出很晚。

当我最大化它时,值为360,但实际值为1260。 如何在最大化后获得宽度?

3 个答案:

答案 0 :(得分:1)

有点令人困惑。实际上你必须实现ComponentListener。然后调用componentResized()。这将为您提供正确的宽度。

答案 1 :(得分:1)

  

当我最大化它时,值是360但实际值是1260热以获得最大化后的宽度?

尝试将代码包装在SwingUtiltities.invokeLater()中。这将把代码放在事件调度线程(EDT)的末尾,因此它应该在调整大小代码完成后执行。

答案 2 :(得分:0)

好的,我找到了解决方案 这篇文章不是很好。

How to detect JFrame window minimize and maximize events?

这段代码,诀窍

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JFrame;

public class Main extends JFrame implements ComponentListener {
  public Main() {
    addComponentListener(this);
  }

  public void componentHidden(ComponentEvent e) {
    System.out.println("componentHidden");
  }

  public void componentMoved(ComponentEvent e) {
    System.out.println("componentMoved");
  }

  public void componentResized(ComponentEvent e) {
    System.out.println("componentResized");

    if (getState() == Frame.ICONIFIED) {
      System.out.println("RESIZED TO ICONIFIED");
    } else if (getState() == Frame.NORMAL) {
      System.out.println("RESIZED TO NORMAL");
    } else {
      System.out.println("RESIZED TO MAXIMIZED");
    }
  }

  public void componentShown(ComponentEvent e) {
  }

  public static void main(String[] arg) {
    Main m = new Main();

    m.setVisible(true);
    m.setSize(new Dimension(300, 100));
    m.setLocation(50, 50);
  }
}