【问题标题】:Resizing JPanels when resized window调整窗口大小时调整 JPanel 的大小
【发布时间】:2017-09-06 20:31:20
【问题描述】:

我有一个 Java 应用程序,在 JFrame 内的 LayeredPane 内有 2 个 JPanel。我希望当我调整窗框大小时,所有面板都会调整大小,尽管它的组件。这是我调整大小函数的代码:

 mainFrame.addComponentListener(new ComponentListener() {

        @Override
        public void componentShown(ComponentEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void componentResized(ComponentEvent e) {
            // Resize components of JFrame to fit new size
            int width = e.getComponent().getWidth();
            int height = e.getComponent().getHeight();

            if(containerJPanel != null) {
                containerJPanel.setBounds(0, 0, 
                        width-DEFAULT_PANEL_MINUS_WITDH, height-DEFAULT_PANEL_MINUS_HEIGHT);
                containerJPanel.setPreferredSize(new Dimension(width-DEFAULT_PANEL_MINUS_WITDH, height-DEFAULT_PANEL_MINUS_HEIGHT));

            }


            if(mainJPanel != null) {
                mainJPanel.setBounds(0, 0, 
                        width-DEFAULT_PANEL_MINUS_WITDH, height-DEFAULT_PANEL_MINUS_HEIGHT);
                mainJPanel.setPreferredSize(new Dimension(width-DEFAULT_PANEL_MINUS_WITDH, height-DEFAULT_PANEL_MINUS_HEIGHT));
            }


            if(loadingPanel != null) {
                loadingPanel.setBounds(0, 0, 
                        width-DEFAULT_PANEL_MINUS_WITDH, height-DEFAULT_PANEL_MINUS_HEIGHT);
                loadingPanel.setPreferredSize(new Dimension(width-DEFAULT_PANEL_MINUS_WITDH, height-DEFAULT_PANEL_MINUS_HEIGHT));
            }

        }

        @Override
        public void componentMoved(ComponentEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void componentHidden(ComponentEvent e) {
            // TODO Auto-generated method stub

        }
    });

这里是变量定义:

 /** Main frame **/

 mainFrame = new JFrame();
 mainFrame.setBounds(100,100,DEFAULT_WINDOW_WIDTH,DEFAULT_WINDOW_HEIGHT);
 mainFrame.setPreferredSize(new Dimension(DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT));
 mainFrame.getContentPane().setLayout(new BorderLayout(0, 0));
 containerJPanel = new JLayeredPane();


 mainFrame.getContentPane().add(containerJPanel, BorderLayout.CENTER);
 containerJPanel.setBounds(0,0,
                    DEFAULT_WINDOW_WIDTH-DEFAULT_PANEL_MINUS_WITDH, DEFAULT_WINDOW_HEIGHT-DEFAULT_PANEL_MINUS_HEIGHT);


 /** Main Panel **/
 mainJPanel = new JPanel();
 mainJPanel.setBounds(0,0,
                    DEFAULT_WINDOW_WIDTH-DEFAULT_PANEL_MINUS_WITDH, DEFAULT_WINDOW_HEIGHT-DEFAULT_PANEL_MINUS_HEIGHT);
 containerJPanel.add(mainJPanel, new Integer(0), 0);
 /** Loading Panel **/
 loadingPanel = new JPanel();
 containerJPanel.add(loadingPanel, new Integer(1), 0);

 loadingPanel.setBounds(0,0,
                    DEFAULT_WINDOW_WIDTH-DEFAULT_PANEL_MINUS_WITDH, DEFAULT_WINDOW_HEIGHT-DEFAULT_PANEL_MINUS_HEIGHT);
 loadingPanel.setLayout(new BorderLayout(0, 0));
 loadingPanel.setOpaque(false);

关键是要有两个面板,因此一次可以看到一个。 我确定我做错了什么,但我无法意识到! 感谢您的帮助。

【问题讨论】:

  • 你真的想要一个 JLayeredPane() 吗?一次显示一个面板的典型用例是具有 CardLayout 的面板...
  • JLayerePane 默认具有null 布局,您是否考虑过将布局管理器更改为其他内容,以便能够根据窗口大小的变化调整组件的大小跨度>
  • 查看使用 CardLayout 的example。你想达到什么目的?
  • 谢谢大家。我要试试 CardLayout!我会带着我的 cmets 回来。
  • 完美!这样可行。谢谢大家。

标签: java swing


【解决方案1】:

正如c0der所说:看使用CardLayout的例子。

【讨论】:

    【解决方案2】:

    我有一个糟糕但有效的解决方案:在我的 actionPerformed 中,每次延迟(通过 javax.swing.Timer.Timer)在 ms- 中,我使用 this.remove(panelToRefresh) 将边界更改为新的窗口边界和 this.add(panelToRefresh) 这对您的计算机来说有点贵,但令人惊讶的是不会闪烁太多 计时器

    gameTime = new Timer(120, this);
    gameTime.start();
    ActionPerformed 中的最少代码

    this.remove(backGround);
    backGround.setSize(this.getWidth(), this.getHeight() + getInsets().top - getInsets().bottom);
    this.add(backGround);

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多