如何动态调整JDesktopPane的大小

时间:2014-08-15 12:24:01

标签: java swing jdesktoppane

所以我在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的答案,我又尝试了一个componentlistener:

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



}

2 个答案:

答案 0 :(得分:1)

您在评论中说明:

  

我必须像这样使用它,因为在Login(InternalFrame)之后,主框架处理desktopPane并加载其他元素,如Jlists等。所以,如果我使用组件监听器,我在哪里放置它?在这个方法或其他地方?

不,你没有。

  • 或许更好的方法是使用CardLayout来交换视图。
  • 这样您就可以首先显示您的登录JPanel,
  • 您可以将JPanel放在另一个JPanel中,方法是给包装器JPanel一个GridBagLayout,然后以默认方式将登录JPanel添加到它(没有GridBagConstraints)
  • 然后使用JPanel将此包装器JPanel添加到您的CardLayout。
  • 然后成功登录,交换到工作JPanel。

另一种选择:

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

答案 1 :(得分:0)

你与ComponentListener分道扬..在componentResized(...)方法中,您需要调整JInternalFrame的位置。

请记住,如果用户在桌面上移动JInternalFrame,则会在调整JFrame大小时自动重新定位。这可能是不可取的。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JInternalFrameDemo implements Runnable
{
  private JInternalFrame iFrame;
  private JDesktopPane desktop;

  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new JInternalFrameDemo());
  }

  public void run()
  {
    desktop = new JDesktopPane();
    desktop.setOpaque(true);
    desktop.addComponentListener(new ComponentListener()
    {
      public void componentResized(ComponentEvent e)
      {
        adjustInternalFrameLocation();
      }

      public void componentMoved(ComponentEvent e) {}
      public void componentShown(ComponentEvent e) {}
      public void componentHidden(ComponentEvent e) {}
    });

    JFrame frame = new JFrame("Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    frame.setContentPane(desktop);
    frame.setVisible(true);

    iFrame = new JInternalFrame("Centered InternalFrame");
    iFrame.setSize(200, 150);
    iFrame.setVisible(true);
    desktop.add(iFrame);

    adjustInternalFrameLocation();
  }

  private void adjustInternalFrameLocation()
  {
    Dimension desktopDim = desktop.getSize();
    Dimension iFrameDim = iFrame.getSize();

    int x = (desktopDim.width - iFrameDim.width) / 2;
    int y = (desktopDim.height - iFrameDim.height) / 2;

    iFrame.setLocation(x, y);
  }
}