Отображение JDesktopPane в JPanel

У меня возникли некоторые трудности с получением JDesktopPane (который содержит JInternalFrame) для добавления в JPanel. Как правильно это сделать? Что я делаю неправильно?

Вот мой голый пример:

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();
            }
        });
    }
}

1 ответ

Решение
  • JDesktop не использует менеджер макетов, поэтому его размер по умолчанию 0x0
  • JPanel использования FlowLayout по умолчанию, который чтит preferredSize из его дочерних компонентов, когда он выкладывает их

Итак, в вашем конструкторе вы можете попробовать изменить менеджер по умолчанию на BorderLayout вместо...

public MainPanel() {
    setLayout(new BorderLayout());
    jDesktopPane.add(jInternalFrame);
    add(jDesktopPane); 
    // pointless
    //setSize(400,400);
    // pointless
    //setVisible(true);
}

Теперь, потому что на самом деле ничто не определяет предпочтительный размер для чего-либо, вы должны предоставить свой собственный...

public Dimension getPreferredSize() {
    return new Dimension(400, 400);
}

Затем, когда вы создаете пользовательский интерфейс, вы можете просто упаковать кадр...

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 не использует менеджер макетов, вы становитесь ответственным за то, чтобы все, что вы добавляете в него, располагалось и размер

jInternalFrame.setBounds(10, 10, 200, 200);
// Just like any frame, it's not visible when it's first created
jInternalFrame.setVisible(true); 
Другие вопросы по тегам