在swing GUI中,如何在用户单击按钮时将JPanel显示为最大化?

时间:2009-11-12 15:06:38

标签: java swing jpanel

当用户点击按钮时,我希望在JFrame中最大化JPanel。实现此目的的最佳方法是什么。视图和数据模型应该在两个面板中同步,即面板中的面板JFrame和最大化的。请给我一些解决方案。

我的要求是:我有一个名为

的4个JPanel的JFrame
  • JPanelA,JPanelB,JPanelC,JPanelD
  • 这里JPanelD包含一个JList和 它下面的按钮说“MAXIMIZE PANEL“按钮.JList有一个JTree 在里面。有时候JList可能会 有大量的数据,但事实并非如此 清楚地向用户显示。

所以他需要单独最大化这个JPanelD才能清楚地看到JList的内容。为此他点击“MAXIMIZE PANEL”按钮。点击动作后,JFrame中的JPanelD仍然存在,同样是一个新的JPanel应该弹出JList数据(即,JPanelD的复制品,说JPanelDMaximized)。这就是我想要做的......

4 个答案:

答案 0 :(得分:2)

当然你可以自己做,但你应该看看JInternalFrame并考虑将它用于你的面板。它会省去一堆头痛。

编辑:Sun的tutorial应该可以满足您的需求。

答案 1 :(得分:1)

  1. 使用JPanel创建JWindow(或未修饰的JFrame)。最初让JWindow不可见。 (这个新JPanel与原始JPanel使用的相同数据模型的连线留作练习。)

  2. 当您的最大化面板按钮的ActionListener执行时,它必须:

    2.1。更新(不可见)JWindow的位置和大小以匹配(可见)JFrame。

    2.2。使您的JFrame不可见。

    2.3。让你的JWindow可见。

  3. 当你的unmaximize-panel按钮的ActionListener执行时,它必须:

    3.1。更新(不可见)JFrame的位置和大小以匹配(可见的)JWindow。

    3.2。让你的JWindow不可见。

    3.3。使您的JFrame可见

  4. 示例:

    package stackoverflow;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.HeadlessException;
    import java.awt.event.ActionEvent;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class MaximizingPanelApp extends JFrame {
    
    private JPanel framePanel;
    private JPanel windowPanel;
    private JFrame maximizedFrame;
    
    public static void main(String[] args) {
        JFrame appFrame = new MaximizingPanelApp();
        appFrame.setVisible( true );
    }
    
    public MaximizingPanelApp() throws HeadlessException {
        super( "Application" );
        setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
        initialize();
    }
    
    private void initialize() {
        // JFrame
        {
            Container container = getContentPane();
            container.setLayout( new BorderLayout() );
    
            framePanel = new JPanel();
            framePanel.setBackground( Color.ORANGE );
            container.add( framePanel, BorderLayout.CENTER );
    
            JButton button = new JButton( new MaximizeAction() );
            container.add( button, BorderLayout.SOUTH );
            setSize( 400, 300 );
        }
    
        // JWindow
        {
            maximizedFrame = new JFrame();
            Container container = maximizedFrame.getContentPane();
            container.setLayout( new BorderLayout() );
    
            windowPanel = new JPanel();
            windowPanel.setBackground( Color.ORANGE );
            container.add( windowPanel, BorderLayout.CENTER );
    
            JButton button = new JButton( new UnMaximizeAction() );
            container.add( button, BorderLayout.SOUTH );
            maximizedFrame.setSize( getSize() );
            maximizedFrame.setUndecorated( true );
        }
    
    }
    
    private class MaximizeAction extends AbstractAction {
    
        private MaximizeAction() {
            super( "Maximize" );
        }
    
        public void actionPerformed(ActionEvent e) {
            maximizedFrame.setSize( getSize() );
            maximizedFrame.setLocation( getLocation() );
            setVisible( false );
            maximizedFrame.setVisible( true );
        }
    }
    
    private class UnMaximizeAction extends AbstractAction {
    
        private UnMaximizeAction() {
            super( "Un-Maximize" );
        }
    
        public void actionPerformed(ActionEvent e) {
            setLocation( maximizedFrame.getLocation() );
            setSize( maximizedFrame.getSize() );
            maximizedFrame.setVisible( false );
            maximizedFrame.dispose();
            setVisible( true );
        }
    }
    }
    

答案 2 :(得分:1)

对您澄清问题的后续行动:

接受我的代码,然后删除:

maximizedFrame.setUndecorated( true );

并在使框架可见之前调整框架的尺寸。这应该满足你需要的最大化行为。

您的另一个问题是您无法将 JPanelD 添加到两个JFrame中。弹出框架必须有自己独特的JPanel对象(我们称之为 JPanelE )。所以你需要:

  1. JPanelD 一样初始化并布置 JPanelE 。这意味着给 JPanelE 提供自己的JList(和JTree等)。
  2. 使用JPanelE的JList从JPanelD的JList共享ListModel,依此类推。成功执行此操作的可行性和详细信息取决于您的实现细节,超出了原始问题的范围。

答案 3 :(得分:0)

这取决于您使用的布局管理器。如果使用默认布局管理器将JPanel添加到JFrame,并且JFrame仅包含JPanel而不包含任何其他内容,那么您将实现所描述的内容。

这是一个例子。 JPanel是绿色的;注意在调整JFrame大小时它如何调整大小。

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

public class ScratchSpace {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Stretchy panel demo");
        final JPanel panel = new JPanel();
        panel.setOpaque(true);
        panel.setBackground(Color.GREEN);
        panel.setPreferredSize(new Dimension(600, 400));
        final JComponent contentPane = (JComponent) frame.getContentPane();
        contentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}