【问题标题】:Creating a Moveable Maximized Window on Windows 7 with Java使用 Java 在 Windows 7 上创建可移动的最大化窗口
【发布时间】:2015-04-20 21:30:54
【问题描述】:

我正在寻找一个将保持最大化的窗口,但可以拖动到其他屏幕(它将再次最大化)。我当前的实现未能做到这一点。

期望的行为:

  • 窗口开始最大化
  • 将窗口拖到不同的显示器
  • 窗口在该显示器上最大化

实际行为:

  • 窗口开始最大化
  • 将窗口拖到不同的显示器
  • 窗口保持未最大化状态(不过,奇怪的是,根据右上角的窗口图标,它看起来好像“认为”它已最大化)
  • 如果我双击窗口以尝试最大化它(我不想这样做;这只是一个扩展的观察),它会在原始屏幕上最大化(不是它当前所在的屏幕)。

有人有什么想法吗?

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

【问题讨论】:

  • 我不确定 this will help,但它似乎解决了 Swing 中的一个错误,即当您使用 Windows 7 的拖动功能最大化/恢复窗口时,不会调用 COMPONENT_RESIZED。跨度>

标签: java windows swing


【解决方案1】:

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

Hack 示例修复:

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

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多