Отображение 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);