【问题标题】:Using a JPanel with a null layout使用具有空布局的 JPanel
【发布时间】:2013-02-05 15:03:11
【问题描述】:

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

编辑: 是的,我意识到使用带有空布局的JPanel 是不好的做法。 CalendarPanel 实际上是别人的代码,我正在尝试将其用于我的目的,而无需对其进行重构。

【问题讨论】:

  • “使用带有空布局的 JPanel” Doooooooooooon't!
  • "..CalendarPanel 扩展 JPanel" 为什么?或者更确切地说,为什么不简单地使用面板实例?
  • 请出示您的代码。
  • @Andrew Thompson,为什么不创建一个扩展 JPanel 的类?我正在制作一个相当大的应用程序,因此我正在为各种 GUI 组件创建不同的类,以便保持一定的组织性。
  • 现在我明白你在说什么了。正如我在上面的编辑中提到的,这不是我的代码。

标签: java swing css-position layout-manager null-layout-manager


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 那么有什么办法可以让它出现在另一个 JPanel 中吗?
  • 使用布局管理器,因为它们会为您确定首选尺寸。如果您不使用布局管理器,那么您有责任覆盖 getPreferredSize() 方法以返回面板的大小。
  • 听起来不太糟糕。
  • 你读过所有的cmets???每个人都建议使用布局管理器,因为计算面板的首选尺寸并不容易,这就是为什么其他人都让布局管理器来完成它的工作。当然你可以选择像 (200, 200) 这样的随机数,但这并不意味着什么,你会得到一个很难改变的丑陋的 GUI。
【解决方案2】:

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

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

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

【讨论】:

  • 它只适用于具有极端自虐倾向的开发人员;-) 并非所有可行的事情都应该完成,尤其是在没有需要极端措施的非常罕见的奇怪极端情况的情况下。这个上下文不是。
  • 是的,但为什么这个答案值得-1?除了大多数开发人员不喜欢空布局这一事实之外,它在技术上还有什么问题?
  • 如果不需要,建议使用空布局在技术上是错误的
  • 我没有建议,我直接回答了OP的问题。如果我添加免责声明,这通常是一个坏主意,会有帮助吗?
  • 是的,添加strong免责声明肯定会有所帮助:-)
猜你喜欢
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多