当前位置: 首页 > 知识库问答 >
问题:

JDesktopPane和BorderLayout

祁刚毅
2023-03-14

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

所以在我的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(“图形项目视图”,真、假、真、真)

这会将面板锁定为BorderLayout。居中,它填满了整个空间,不允许其他任何东西。我猜这是因为JDesktopPanes使用OverlayLayout,当我将布局设置为覆盖OverlayLayout的BorderLayout时,我的内部框架就添加到中心。

所以问题是:我如何像现在这样布局JMenuBar和左病房面板,同时保持JinternalFrame的功能?

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

编辑:我如何添加JInternalFrame(抱歉,它仍然显示panel,但它已转换为JInternalFrame):

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

共有1个答案

陆昊
2023-03-14

我将从一个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);
        }            
    }        
}

您的需求可能略有不同,但基本概念应该会让您有所行动。

根据应用程序的结构,我可能也想将Controlls窗格分隔成一个单独的类。

 类似资料:
  • 我有表单,我想在我的上显示它们。主窗体是MDI容器,所以我只想知道如何显示主雇员窗体。 下面是创建目标代码的: 这里是调用,尽管它不起作用。 我该如何解决这个问题?我想让表单显示在Jdesktoppane上 它现在正在工作。我使用了以下参考。

  • 主要内容:1 Java JDesktopPane的介绍,2 Java JDesktopPane的字段,3 Java JDesktopPane的构造方法,4 Java JDesktopPane的案例1 Java JDesktopPane的介绍 JDesktopPane类可用于创建“多文档”应用程序。一个多文档应用程序可以包含许多窗口。我们通过在主窗口中将contentPane作为JDesktopPane类或子类的实例来实现。内部窗口将JInternalFrame实例添加到JdesktopPane实

  • 问题内容: 我想在两个JPanel之间绘制线,但是线未出现在layeredPane上。 这是我所做的,请仔细阅读,可编译。请尝试更正此代码。我已经尝试过以这种方式在内部框架上绘制线条,但不适用于JPanels。 问题答案: 我很困惑。您从扩展了类,但随后将其添加到… 扩展中。 默认情况下,如果没有布局管理器,则会将其添加到,大小为0x0。 我不确定您希望借此实现什么。 更新示例 您面临的问题是pa

  • 我想隐藏我的在按钮的触发器中。但这不会隐藏自己。我创建了一个静态的空格方法,它隐藏了框架,并在action中调用它。我需要运行另一个EDT来隐藏我的帧吗?任何提示将不胜感激。

  • 我有一个叫做“菜单项目”的框架。 我有另一个称为"Main_Menu"的框架,它有一个JButton,点击按钮后,我想在JDesktopPane中调用框架"Menu_Project"。我试图遵循一个教程YouTube在这个链接:https://www.youtube.com/watch?v=TUL3qEoZkR4 当我运行它时,我得到: 我的代码: 谁能指出我错在哪里。我下面的视频教程。

  • 问题内容: 我加入一堆s转换为,当用户选择通过菜单打开的各种特征。但是我希望内部框架以桌面窗格为中心打开,而不是默认情况下位于左上方的内部框架。 如何指定JInternalFrames居中打开,或在打开后将其移动到中心? 问题答案: 作为参考,这是我根据dogbane的建议使用的解决方案: