gpt4 book ai didi

java - 根据父级调整大小最小化或框架的对话框

转载 作者:行者123 更新时间:2023-12-02 07:43:28 24 4
gpt4 key购买 nike

我希望有一个行为类似于对话框的窗口,即它与父窗口一起关闭,但它的行为应类似于普通框架,特别是它应具有最大化/恢复按钮。如何创建绑定(bind)到父窗口的窗口(当父窗口关闭时它们关闭)并继承一些属性,即窗口图标?

我能想到的最好的方法是编写我自己的类,它包装 JFrame 并采用父级。此类为父级安装一个监听器并跟踪其所有实例,因此当父级关闭时它可以关闭所有实例。 Exit_on_close 不能用于父级,因为应用程序的其余部分应该继续运行。

那么有没有一种简单的方法,或者我必须自己开设类(class)吗?

最佳答案

您可以复制几乎任何 JDialog 行为,除了它在 JFrame 之上的定位(对于 Win 平台的这种情况有一些 native 解决方案,但使用它是一件坏事......真的)。

以下示例展示了您只需几分钟即可完成的操作:

ChildFrameTest.java

public class ChildFrameTest
{
public static void main ( String[] args )
{
JFrame application = new JFrame ();
application.setSize ( 600, 600 );
application.setLocationRelativeTo ( null );
application.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );

JChildFrame tool = new JChildFrame ( application );
tool.setModalExclusionType ( Dialog.ModalExclusionType.APPLICATION_EXCLUDE );
tool.setSize ( 100, 600 );
tool.setLocation ( application.getX () + application.getWidth (), application.getY () );

new WindowFollowListener ( tool, application );

application.setVisible ( true );
tool.setVisible ( true );
}

public static class JChildFrame extends JFrame
{
public JChildFrame ( JFrame parent )
{
super ();
parent.addWindowListener ( new WindowAdapter ()
{
public void windowClosing ( WindowEvent e )
{
dispose ();
}
} );
}
}
}

和 WindowFollowListener 添加一些不错的子框架行为:

WindowFollowListener.java

public class WindowFollowListener extends ComponentAdapter
{
private boolean enabled = true;
private Window followingWindow;
private Window parentWindow;
private Point ll;

public WindowFollowListener ( Window followingWindow, Window parentWindow )
{
super ();

this.followingWindow = followingWindow;
this.parentWindow = parentWindow;
this.ll = parentWindow.getLocation ();

parentWindow.addComponentListener ( this );
}

public boolean isEnabled ()
{
return enabled;
}

public void setEnabled ( boolean enabled )
{
this.enabled = enabled;
}

public Window getFollowingWindow ()
{
return followingWindow;
}

public void setFollowingWindow ( Window followingWindow )
{
this.followingWindow = followingWindow;
}

public Window getParentWindow ()
{
return parentWindow;
}

public void setParentWindow ( Window parentWindow )
{
this.parentWindow = parentWindow;
}

public void componentResized ( ComponentEvent e )
{
this.ll = parentWindow.getLocation ();
}

public void componentMoved ( ComponentEvent e )
{
if ( enabled && followingWindow != null && parentWindow != null )
{
Point nl = parentWindow.getLocation ();
Point fwl = followingWindow.getLocation ();
followingWindow.setLocation ( fwl.x + nl.x - ll.x, fwl.y + nl.y - ll.y );
this.ll = nl;
}
}
}

关于java - 根据父级调整大小最小化或框架的对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com