使用Java在Windows 7上创建可移动的最大化窗口

使用Java在Windows 7上创建可移动的最大化窗口,java,windows,swing,Java,Windows,Swing,我希望创建一个窗口,该窗口将保持最大化,但可以拖动到其他屏幕(它将再次最大化)。我当前的实现无法做到这一点 期望的行为: 窗口开始最大化 将窗口拖动到不同的监视器 窗口在监视器上最大化 实际行为: 窗口开始最大化 将窗口拖动到不同的监视器 窗口仍处于未最大化状态(但奇怪的是,根据右上角的窗口图标,它看起来似乎“认为”它已最大化) 如果我双击窗口试图将其最大化(我不想这样做;这只是一个扩展观察),它将在原始屏幕(而不是当前屏幕)上最大化 有人有什么想法吗 SSCCE: import jav

我希望创建一个窗口,该窗口将保持最大化,但可以拖动到其他屏幕(它将再次最大化)。我当前的实现无法做到这一点

期望的行为:

  • 窗口开始最大化
  • 将窗口拖动到不同的监视器
  • 窗口在监视器上最大化
实际行为:

  • 窗口开始最大化
  • 将窗口拖动到不同的监视器
  • 窗口仍处于未最大化状态(但奇怪的是,根据右上角的窗口图标,它看起来似乎“认为”它已最大化)
  • 如果我双击窗口试图将其最大化(我不想这样做;这只是一个扩展观察),它将在原始屏幕(而不是当前屏幕)上最大化
有人有什么想法吗

SSCCE:

import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ComponentMovedTest extends JPanel
{
    private ComponentMovedTest()
    {
        final JFrame frame = new JFrame("ComponentMovedTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // FIXME: Naive attempt at ensuring the window becomes maximized
        // on the screen it moves to after moving finishes.
        frame.addComponentListener( new ComponentAdapter()
        {
            @Override
            public void componentMoved( ComponentEvent e )
            {
                frame.setExtendedState( JFrame.MAXIMIZED_BOTH );
            }
        });

        frame.setExtendedState( JFrame.MAXIMIZED_BOTH );
        frame.setResizable( false );
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        new ComponentMovedTest();
    }
}

因此,我最终采用了一种黑客解决方案。我无法让自动最大化以可接受的方式工作。相反,我这样做是为了,如果窗口没有最大化,它将强制执行严格的大小,但仍然允许您手动最大化窗口。黑客解决方案如下。如果没有人有更接近原始问题意图的解决方案,我将在几天后将其标记为已被接受的答案

黑客示例修复程序:

import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ComponentMovedTest extends JPanel
{
    Dimension size = new Dimension( 0, 0 );

    private ComponentMovedTest()
    {
        final JFrame frame = new JFrame( "ComponentMovedTest" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        // NOTE: With a proper layout manager, this ComponentListener may
        //       not be necessary, as the layout manager would likely enforce
        //       minimum/maximum window sizing.  This means fix #2 could
        //       also be removed in favor of setting min/max/pref size,
        //       based on the layout manager.
        frame.addComponentListener( new ComponentAdapter()
        {
            @Override
            public void componentResized( ComponentEvent e )
            {
                if (frame.getExtendedState() != JFrame.MAXIMIZED_BOTH)
                {
                    // FIX #3: resize the window to the default size
                    //         whenever resized.
                    frame.setSize(size);
                }
            }
        });

        // FIX #1: Extend after setting visible.
        frame.setVisible( true );
        frame.setExtendedState( JFrame.MAXIMIZED_BOTH );

        // FIX #2: Set a default window size.
        size = frame.getSize();
    }

    public static void main( String[] args )
    {
        new ComponentMovedTest();
    }
}
我不确定是否,但它似乎解决了Swing中的一个错误,当您使用Windows7的拖动功能最大化/还原窗口时,没有调用调整大小的组件。