繁体   English   中英

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

[英]In swing GUI how to show a JPanel as maximized when the user clicks a button?

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

我的要求是:我有一个名为的4个JPAnel的JFrame

  • JPanelA,JPanelB,JPanelC,JPanelD
  • 这里JPanelD包含一个JList,下面的按钮说“MAXIMIZE PANEL”按钮。 JList里面有一个JTree。 有时,JList可能具有大量数据,并且用户无法清楚地看到它。

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

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

编辑:Sun的教程应该能满足您的需求。

  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可见

例:

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

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

拿我的代码,然后删除:

maximizedFrame.setUndecorated( true );

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

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

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

这取决于您使用的布局管理器。 如果使用默认布局管理器将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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM