1

我想在用户单击按钮时最大化 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)应该弹出。这就是我想要做的..

4

4 回答 4

2

当然,您可以自己执行此操作,但您应该真正查看JInternalFrame并考虑将其用于您的面板。它将节省一堆头痛。

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

于 2009-11-12T15:11:02.230 回答
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 可见

例子:

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 );
    }
}
}
于 2009-11-12T20:29:19.043 回答
1

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

获取我的代码,然后删除:

maximizedFrame.setUndecorated( true );

并在使其可见之前将框架尺寸放大。这应该满足您需要的类似最大化的行为。

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

  1. 像JPanelD一样初始化和布局JPanelE。这意味着给JPanelE自己的 JList(和 JTree,等等)。
  2. 将 JPanelD 的 JList 中的 ListModel 与 JPanelE 的 JList 共享,以此类推。成功执行此操作的可行性和细节取决于您的实施细节,并且超出了您最初问题的范围。
于 2009-11-13T06:40:30.747 回答
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);
    }
}
于 2009-11-12T15:11:37.283 回答