2013-02-20 107 views
1

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

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

+9

*“使用带有空布局的JPanel”* *** Doooooooooooon't!*** – 2013-02-20 14:56:05

+0

*“.. CalendarPanel扩展JPanel”*为什么?或者说,为什么不简单地使用面板的实例呢? – 2013-02-20 14:58:08

+0

请显示您的代码。 – slawter 2013-02-20 15:12:03

回答

7

,当我直接将其添加到一个窗口,它是唯一可见的。

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

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

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

这就是为什么你不应该使用空布局。而是使用布局管理器,因为他们为你做了所有这些额外的工作。

+0

那么是否有任何解决方法让它出现在另一个JPanel中? – 2013-02-21 04:05:39

+0

使用布局管理器,因为它们将确定您的首选大小。如果你不使用布局管理器,那么你有责任重写getPreferredSize()方法来返回面板的大小。 – camickr 2013-02-21 04:22:12

+0

这听起来不太可怕。 – 2013-02-21 04:35:28

5

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

如果您坚持使用空布局,您将不得不按照documentation中所述手动定位JPanel。这是一个例子。

enter image description here

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); 
      } 
     }); 
    } 
} 
+0

-1为空布局 – kleopatra 2013-02-20 17:21:24

+0

为什么?使用空布局可能不是最佳实践,但它当然是一种选择。您是否阅读过有关此官方Java文档的链接? – 808sound 2013-02-20 17:23:08

+1

这是一个只适用于极端受虐狂冲动的开发者的选项;-)并非所有可行的事情都应该完成,特别是如果没有非常罕见的奇怪角落案例需要采取极端措施。这个上下文不是。 – kleopatra 2013-02-20 17:29:22