使用具有null布局的JPanel

Joe*_*hel 2 java swing css-position layout-manager null-layout-manager

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

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

cam*_*ckr 8

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

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

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

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

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


808*_*und 6

注意:使用空布局通常是一个非常糟糕的主意.请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);
          }
      });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但为什么这个答案值得-1?除了大多数开发人员不喜欢null布局这一事实外,它在技术上有什么问题? (5认同)
  • 我没有建议,我直截了当地回答了OP的问题.如果我添加免责声明一般来说这是一个坏主意会有帮助吗? (5认同)