使用具有null布局的JPanel

所以我有一个名为CalendarPanel的类,它扩展了JPanel 。 它使用null布局。 我如何使用CalendarPanel作为常规组件? 当我把它放在另一个JPanel然后将其添加到窗口时,它就会消失。 它只有在我直接添加到窗口时才可见。

编辑:是的,我意识到使用带有空布局的JPanel是不好的做法。 CalendarPanel实际上是别人的代码,我试图将它用于我的目的,而不必重构它。

它只有在我直接添加到窗口时才可见。

这是因为窗口默认使用BorderLayout,并会自动调整面板大小以适应窗口。

当我把它放在另一个JPanel然后将其添加到窗口时,它就会消失。

这是因为JPanel默认使用FlowLayout,流布局遵循添加到其中的组件的首选大小。 由于您使用的是null布局,因此面板没有首选大小,因此不会绘制任何内容。

这就是为什么你不应该使用null布局。 而是使用布局管理器,因为它们为您完成所有这些额外的工作。

注意 :使用空布局通常是一个非常糟糕的主意。 请改用LayoutManager

如果您坚持使用null布局,则必须按照文档中的说明手动定位JPanel 。 这是一个例子。

在此处输入图像描述

 import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class Test extends JFrame { static int defaultX = 10; static int defaultY = 10; static int defaultW = 150; static int defaultH = 50; public Test() { super("Test"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // here is the outer JPanel final JPanel outer = new JPanel(new BorderLayout()); JPanel inner = new JPanel(new BorderLayout()); // here is the main component we want to see // when the outer panel is added to the null layout JButton mainComponent = new JButton("Test"); inner.add("Center", mainComponent); outer.add("Center", inner); JPanel c = (JPanel)getContentPane(); // This panel has a null layout! final JPanel nullLayoutPanel = new JPanel(); nullLayoutPanel.setLayout(null); c.add("Center", nullLayoutPanel); // set the bounds of the outer panel manually // when using the null layout! nullLayoutPanel.add(outer); outer.setBounds(defaultX, defaultY, defaultW, defaultH); JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10)); final JTextField x = new JTextField(""+defaultX, 3); final JTextField y = new JTextField(""+defaultY, 3); final JTextField w = new JTextField(""+defaultW, 3); final JTextField h = new JTextField(""+defaultH, 3); JButton b = new JButton("Resize"); b.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { try { outer.setBounds( Integer.parseInt(x.getText()), Integer.parseInt(y.getText()), Integer.parseInt(w.getText()), Integer.parseInt(h.getText()) ); outer.revalidate(); } catch(Exception ex) {} } } ); controlPanel.add(x); controlPanel.add(y); controlPanel.add(w); controlPanel.add(h); controlPanel.add(b); c.add("South", controlPanel); } public static void main(String[] argv) { SwingUtilities.invokeLater(new Runnable() { public void run() { Test p = new Test(); p.setSize(300, 200); p.setVisible(true); } }); } }