当用户点击按钮时,我希望在JFrame中最大化JPanel。实现此目的的最佳方法是什么。视图和数据模型应该在两个面板中同步,即面板中的面板JFrame和最大化的。请给我一些解决方案。
我的要求是:我有一个名为
的4个JPanel的JFrame所以他需要单独最大化这个JPanelD才能清楚地看到JList的内容。为此他点击“MAXIMIZE PANEL”按钮。点击动作后,JFrame中的JPanelD仍然存在,同样是一个新的JPanel应该弹出JList数据(即,JPanelD的复制品,说JPanelDMaximized)。这就是我想要做的......
答案 0 :(得分:2)
当然你可以自己做,但你应该看看JInternalFrame并考虑将它用于你的面板。它会省去一堆头痛。
编辑:Sun的tutorial应该可以满足您的需求。
答案 1 :(得分:1)
使用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 );
}
}
}
答案 2 :(得分:1)
对您澄清问题的后续行动:
接受我的代码,然后删除:
maximizedFrame.setUndecorated( true );
并在使框架可见之前调整框架的尺寸。这应该满足你需要的最大化行为。
您的另一个问题是您无法将 JPanelD 添加到两个JFrame中。弹出框架必须有自己独特的JPanel对象(我们称之为 JPanelE )。所以你需要:
答案 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);
}
}