所以我有一个叫做CalendarPanel
的类,它扩展了JPanel
。它使用空布局。我如何使用CalendarPanel
作为常规组件?当我把它放在另一个JPanel
中,然后将它添加到一个窗口中时,它会消失。只有将它直接添加到窗口时才可见。使用一个空布局的JPanel
编辑: 是的,我意识到使用JPanel
与空布局是不好的做法。 CalendarPanel
实际上是别人的代码,我试图将其用于我的目的而不必重构它。
所以我有一个叫做CalendarPanel
的类,它扩展了JPanel
。它使用空布局。我如何使用CalendarPanel
作为常规组件?当我把它放在另一个JPanel
中,然后将它添加到一个窗口中时,它会消失。只有将它直接添加到窗口时才可见。使用一个空布局的JPanel
编辑: 是的,我意识到使用JPanel
与空布局是不好的做法。 CalendarPanel
实际上是别人的代码,我试图将其用于我的目的而不必重构它。
,当我直接将其添加到一个窗口,它是唯一可见的。
这是因为窗口默认使用BorderLayout,并会自动调整面板的大小以适应窗口。
当我把它放在另一个JPanel中,然后将它添加到一个窗口中时,它就消失了。
这是因为JPanel默认使用FlowLayout,并且流布局会考虑添加到其中的组件的首选大小。由于您使用的是空布局,因此您的面板没有首选大小,因此没有任何内容被绘制。
这就是为什么你不应该使用空布局。而是使用布局管理器,因为他们为你做了所有这些额外的工作。
那么是否有任何解决方法让它出现在另一个JPanel中? – 2013-02-21 04:05:39
使用布局管理器,因为它们将确定您的首选大小。如果你不使用布局管理器,那么你有责任重写getPreferredSize()方法来返回面板的大小。 – camickr 2013-02-21 04:22:12
这听起来不太可怕。 – 2013-02-21 04:35:28
注意:通常使用空布局是一个非常糟糕的主意。改为使用LayoutManager
。
如果您坚持使用空布局,您将不得不按照documentation中所述手动定位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);
}
});
}
}
*“使用带有空布局的JPanel”* *** Doooooooooooon't!*** – 2013-02-20 14:56:05
*“.. CalendarPanel扩展JPanel”*为什么?或者说,为什么不简单地使用面板的实例呢? – 2013-02-20 14:58:08
请显示您的代码。 – slawter 2013-02-20 15:12:03