gpt4 book ai didi

java - 如何动态调整 JDesktopPane 的大小

转载 作者:行者123 更新时间:2023-12-01 12:38:46 26 4
gpt4 key购买 nike

所以我在JFrame上有一个desktopPane,在desktopPane上是一个JInternalFrame。现在,我将internalFrame的位置设置为desktopPane的中心,但是当我调整整个Frame的大小时,InternalFrame保持在原来的位置,并且不会将位置更改为新的中心。

public void openLogin(){
JInternalFrame iFrame = new LoginScreen(appMain);
desktopPane =new JDesktopPane();
add(desktopPane);
frameSize = getSize();
desktopPane.setSize(frameSize);
Dimension desktopSize = desktopPane.getSize();
Dimension jInternalFrameSize = iFrame.getSize();
iFrame.setLocation((desktopSize.width - jInternalFrameSize.width)/2, (desktopSize.height- jInternalFrameSize.height)/2);
desktopPane.add(iFrame);
}

这是我设置位置的方法,如何更改它以匹配新的中心?我与一些听众尝试过,但没有任何效果。

<小时/>

好吧,因为我没有时间使用 @Hovercraft full of Eels 的答案,所以我再次尝试了一个组件监听器:

public void openLogin(){
JInternalFrame iFrame = new LoginScreen(appMain);
desktopPane =new JDesktopPane();
add(desktopPane);
frameSize = getSize();
newSize=frameSize;
desktopPane.addComponentListener(new ComponentListener() {

@Override
public void componentShown(ComponentEvent e) {

}

@Override
public void componentResized(ComponentEvent e) {
newSize = getSize();
}

@Override
public void componentMoved(ComponentEvent e) {

}

@Override
public void componentHidden(ComponentEvent e) {

}
});
if(newSize != frameSize){
desktopPane.setSize(newSize);
Dimension desktopSize = desktopPane.getSize();
Dimension jInternalFrameSize = iFrame.getSize();
iFrame.setLocation((desktopSize.width - jInternalFrameSize.width)/2, (desktopSize.height- jInternalFrameSize.height)/2);
desktopPane.add(iFrame);

}
else{
desktopPane.setSize(frameSize);
Dimension desktopSize = desktopPane.getSize();
Dimension jInternalFrameSize = iFrame.getSize();
iFrame.setLocation((desktopSize.width - jInternalFrameSize.width)/2, (desktopSize.height- jInternalFrameSize.height)/2);
desktopPane.add(iFrame);

}

}

它甚至不会触发监听器。@Hovercraft,我会尝试你的东西,但不是今天,不过非常感谢你!

好吧,我发现了我的失败,现在可以了:

public void openLogin(){
iFrame = new LoginScreen(appMain);
desktopPane =new JDesktopPane();
add(desktopPane);
frameSize = getSize();
newSize=frameSize;
addComponentListener(new ComponentListener() {

@Override
public void componentShown(ComponentEvent e) {

}

@Override
public void componentResized(ComponentEvent e) {
newSize = getSize();
System.out.println("blaaaa");
desktopPane.setSize(newSize);
Dimension desktopSize = getSize();
Dimension jInternalFrameSize = iFrame.getSize();
iFrame.setLocation((desktopSize.width - jInternalFrameSize.width)/2, (desktopSize.height- jInternalFrameSize.height)/2);

}

@Override
public void componentMoved(ComponentEvent e) {

}

@Override
public void componentHidden(ComponentEvent e) {

}
});

desktopPane.setSize(frameSize);
Dimension desktopSize = desktopPane.getSize();
Dimension jInternalFrameSize = iFrame.getSize();
iFrame.setLocation((desktopSize.width - jInternalFrameSize.width)/2, (desktopSize.height- jInternalFrameSize.height)/2);
desktopPane.add(iFrame);



}

最佳答案

您在评论中指出:

I have to use it like this, because after the Login(InternalFrame) the main Frame disposes the desktopPane and loads other elements like Jlists etc. So if I use the component listener where do I place it? Inside this method or somewhere else?

不,你不知道。

  • 也许更好的方法是使用 CardLayout交换意见。
  • 这样您就可以先显示您的登录 JPanel,
  • 您可以将此 JPanel 置于另一个 JPanel 的中心,方法是为包装器 JPanel 提供 GridBagLayout,然后以默认方式(无需 GridBagConstraints)将您的登录 JPanel 添加到其中
  • 然后使用 JPanel 将此包装器 JPanel 添加到您的 CardLayout。
  • 然后成功登录后,切换到工作 JPanel。
<小时/>

另一种选择:

  • 使用模态对话框(例如模态 JDialog 或 JOptionPane)进行登录。
  • 在主 GUI 中显示 JPanel 简介
  • 显示上面的对话框,再次使其成为模式,以便在处理该对话框之前用户无法与主 GUI 交互。
  • 当对话框不再可见时,程序流程返回到调用代码。
  • 您可以在此处检查输入到对话框中的结果,该结果将告诉您是否从介绍 JPanel 切换到工作 JPanel。
  • 再次强调,使用 CardLayout 来帮助您进行交换。

关于java - 如何动态调整 JDesktopPane 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25326343/

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