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