首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JDesktopPane中显示JPanel

在JDesktopPane中显示JPanel
EN

Stack Overflow用户
提问于 2015-09-12 01:00:41
回答 1查看 1.5K关注 0票数 0

我很难让一个JDesktopPane (包含一个JInternalFrame)添加到JPanel中。做这件事的正确方法是什么?我做错了什么?

下面是我的赤裸骨骼的例子:

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;

public class MainPanel extends JPanel {

    JDesktopPane jDesktopPane = new JDesktopPane();
    JInternalFrame jInternalFrame = new JInternalFrame();

    public MainPanel() {

        jDesktopPane.add(jInternalFrame);
        add(jDesktopPane);
        setSize(400,400);
        setVisible(true);
    }

    private static void createAndShowGui() {

        JFrame frame = new JFrame("This isn't working...");
        MainPanel mainPanel = new MainPanel();
        frame.setLayout(new BorderLayout());

        frame.add(mainPanel, BorderLayout.CENTER);
        frame.setContentPane(mainPanel);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLocationByPlatform(false);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-12 01:14:21

  • JDesktop不使用布局管理器,因此它的默认/首选大小是0x0
  • JPanel默认使用FlowLayout,它在放置子组件时遵守其子组件的preferredSize

因此,在构造函数中,可以尝试将默认布局管理器更改为BorderLayout .

代码语言:javascript
复制
public MainPanel() {
    setLayout(new BorderLayout());
    jDesktopPane.add(jInternalFrame);
    add(jDesktopPane); 
    // pointless
    //setSize(400,400);
    // pointless
    //setVisible(true);
}

现在,你因为什么都没有定义任何东西的首选尺寸,你应该提供你自己的.

代码语言:javascript
复制
public Dimension getPreferredSize() {
    return new Dimension(400, 400);
}

然后当您创建UI时,您可以简单地打包框架..。

代码语言:javascript
复制
private static void createAndShowGui() {

    JFrame frame = new JFrame("This should be working now...");
    MainPanel mainPanel = new MainPanel();
    frame.setLayout(new BorderLayout());

    // pointless considering the setContentPane call
    //frame.add(mainPanel, BorderLayout.CENTER);
    frame.setContentPane(mainPanel);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.pack();
    frame.setLocationByPlatform(false);
    //frame.setSize(500, 500);
    frame.setVisible(true);
}

现在,由于JDesktopPane不使用任何布局管理器,所以您将负责确保添加到其中的任何内容都已定位和大小。

代码语言:javascript
复制
jInternalFrame.setBounds(10, 10, 200, 200);
// Just like any frame, it's not visible when it's first created
jInternalFrame.setVisible(true); 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32534101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档