JDesktopPane和BorderLayout

时间:2013-06-23 23:58:40

标签: java swing jinternalframe jdesktoppane

我正在编写一个试图模拟物种进化的程序,它有一个如下所示的窗口: enter image description here

最初右下方的空白区域是一个面板,它旨在绘制样本,位置和行进路径的视觉表示(并不重要)。但是,您将能够打开某种窗口,允许您创建/编辑不同的项目(如物种,位置和旅行路径)。最初我计划那些只是弹出窗口。但是,我想我可能会使用JInternal窗格来显示弹出窗口和可视化表示屏幕。

所以在我的JFrames构造函数中:

JDesktopPane pane = new JDesktopPane();
this.setContentPane(pane);
setLayout(new BorderLayout());//To layout the menubar, and the items on the left

panel = new GraphicsPanel(manager);
panel.setVisible(true);

在图形面板构造函数中:super("Graphic Project View",true,false,true,true);

这会将Panel锁定到BorderLayout.CENTER,它会填满整个空间,不允许任何其他内容。我的猜测是因为JDesktopPanes使用OverlayLayout,当我将布局设置为BorderLayout时会覆盖OverlayLayout,因此我的InternalFrame只会被添加到中心。

所以问题是: 我如何布置像JMenuBar这样的东西,以及现在的左侧病房面板,同时仍然保持JInternalFrames的能力?

现在我将通过JFrame.setJMenuBar(JMenuBar)而不是JFrame.add(menuBar,BorderLayout.NORTH)添加JMenuBar,然后将左侧的面板更改为JInternal框架,但如果可能的话,我会我宁愿按原样使用它。如果我可以将DesktopPane添加到BorderLayout.CENTER的JFrame中,然后只需将框架添加到桌面窗格,我想要它。如果内部框架仅限于该区域,我会不在乎,只要它仍然可移动,等等。

编辑:我如何添加JInternalFrame(很抱歉它仍然说面板,但它已被转换为JInternalFrame):

panel = new GraphicsPanel(manager);
panel.setSize(desktop.getSize());
panel.setLocation(0,0);
panel.setVisible(true);
desktop.add(panel);

1 个答案:

答案 0 :(得分:3)

我会从单个JPanel开始(让它全部放在基础窗格中),这将容纳其他容器。

使用边框布局,我会将“控件”面板添加到基本窗格的WEST位置。在CENTER位置,我会添加JDesktopPane

我将主窗口布局设置为BorderLayout并将基础窗格添加到其中。这将允许您使用JFrame#setJMenuBar管理菜单栏,同时保持布局的结果。

这将允许您包含使用桌面上的JInternalFrame而不影响其余的布局......

简单示例

这是一个过于简化的例子,用于演示上述基本概念......

enter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SimpleLayout {

    public static void main(String[] args) {
        new SimpleLayout();
    }

    public SimpleLayout() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JMenuBar mb = new JMenuBar();
                mb.add(new JMenu("File"));
                mb.add(new JMenu("Add"));
                mb.add(new JMenu("Edit"));
                mb.add(new JMenu("Analize"));
                mb.add(new JMenu("About"));

                JFrame frame = new JFrame("Testing");
                frame.setJMenuBar(mb);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BasePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class BasePane extends JPanel {

        private JTextArea species;
        private JTextArea locations;
        private JTextArea travelPaths;

        private JDesktopPane desktopPane;

        public BasePane() {                
            setLayout(new BorderLayout());

            desktopPane = new JDesktopPane();

            species = new JTextArea("Species");
            locations = new JTextArea("Locations");
            travelPaths = new JTextArea("TravelPaths");

            JPanel controls = new JPanel(new GridLayout(3, 0));
            controls.add(new JScrollPane(species));
            controls.add(new JScrollPane(locations));
            controls.add(new JScrollPane(travelPaths));

            add(controls, BorderLayout.WEST);
            add(desktopPane);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }            
    }        
}

您的要求可能略有不同,但基本概念应该让您感动。

根据应用程序的结构,我可能会将Controls窗格分成单独的类。