【问题标题】:JDesktopPane and BorderLayoutJDesktopPane 和 BorderLayout
【发布时间】:2013-06-20 10:11:54
【问题描述】:

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

最初右下角的空白区域是一个面板,它旨在绘制标本、位置和行进路径的视觉表示(并不重要)。但是,您将能够打开某种窗口,允许您创建/编辑不同的项目(如物种、位置和旅行路径)。最初我计划让那些只是弹出窗口。但是,我想我可能会使用 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);

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

所以问题是: 我如何像现在一样布置 JMenuBar 和左侧面板之类的东西,同时仍然保持拥有 JInternalFrames 的能力?

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

编辑:我如何添加 JInternalFrame(对不起,它仍然显示面板,但它已转换为 JInternalFrame):

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

【问题讨论】:

    标签: java swing jinternalframe jdesktoppane


    【解决方案1】:

    我会从一个 JPanel 开始(让它成为基本窗格),它将容纳其他容器。

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

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

    这将允许您在桌面上使用JInternalFrames 而不会影响布局的其余部分...

    简单示例

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

    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 窗格分离到一个单独的类中。

    【讨论】:

    • @camickr 是的,我同意,但我倾向于在远离框架的地方构建我的 UI,所以这是一种习惯的力量。意思是,这意味着我可以拿起“基础”窗格并将其放在我想要的任何地方。我想很多都归结为“控件”和桌面之间的相互关系。如果建模正确,则不需要“基础”窗格,因为模型会执行工作
    • 好点,这是更好的设计。删除评论(所以我不会给人们一个不好的建议)。
    • 我试过了,还是不行,可能是我做错了什么,我再试试。如果可行,我会接受你的回答。
    • @csga5000 添加简单示例
    • @MadProgrammer 谢谢!我之前尝试过它时从未让它工作的原因是因为我没有正确设置 JInternalFrame 的大小。我将把它编辑到你的例子中。
    猜你喜欢
    • 2013-08-28
    • 2011-06-03
    • 1970-01-01
    • 2017-06-30
    • 2010-09-14
    • 2023-03-22
    • 1970-01-01
    • 2013-06-06
    • 2012-07-24
    相关资源
    最近更新 更多