[英]In swing GUI how to show a JPanel as maximized when the user clicks a button?
当用户点击按钮时,我希望在JFrame中最大化JPanel。实现此目的的最佳方法是什么。视图和数据模型应该在两个面板中同步,即JFrame中的面板和最大化一个。请给我一些解决方案。
我的要求是:我有一个名为的4个JPAnel的JFrame
所以他需要单独最大化这个JPanelD才能清楚地看到JList的内容。为此他点击“MAXIMIZE PANEL”按钮。点击动作后,JFrame中的JPanelD仍然存在,也是一个具有相同JList数据的新JPanel(应该弹出JPanelD的复制品,说JPanelDMaximized。这就是我想要做的......
当然你可以自己做,但你应该看看JInternalFrame并考虑将它用于你的面板。 它会省去一堆头痛。
编辑:Sun的教程应该能满足您的需求。
使用JPanel创建JWindow(或未修饰的JFrame)。 最初让JWindow不可见。 (这个新JPanel与原始JPanel使用的相同数据模型的连线留作练习。)
当您的最大化面板按钮的ActionListener执行时,它必须:
2.1。 更新(不可见)JWindow的位置和大小以匹配(可见)JFrame。
2.2。 使您的JFrame不可见。
2.3。 让你的JWindow可见。
当你的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 )。 所以你需要:
这取决于您使用的布局管理器。 如果使用默认布局管理器将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.