当前位置: 首页 > 面试题库 >

setLayout(null)时,JPanel上的组件未显示

陆斌
2023-03-14
问题内容

有人可以告诉我为什么组合框不显示吗?我有一个控制器:

public class TestController extends JPanel {

TestView cgView;

public TestController() 
{

    setLayout(null);

    cgView=new TestView();

    add(cgView);

}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
             JFrame fr = new JFrame("testt");
                fr.setSize(1200,1000);
                fr.setResizable(false);

                TestController cgc=new TestController();
                fr.html" target="_blank">setBackground(Color.white);
                fr.setVisible(true);

                fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                fr.add(cgc);

         }
        });
    }


}

和一个观点

public class TestView extends JPanel{
    private static final long serialVersionUID = 1L;

    public JComboBox<String> comboBox;

    public TestView() {

          comboBox= new JComboBox<>(new String[] {"option1", "option2" });
          comboBox.setBounds(100,500, 100, 20);
          add(comboBox);

    }
}

由于TestController中的 setLayout(null) ,我看不到comboBox。如果我将
add(cgView.comboBox)添加 到TestContoller()中,则它看起来像这样:

public TestController() 
    {

        setLayout(null);

        cgView=new TestView();

        add(cgView);
        add(cgView.comboBox);

    }

比我能看到的。有人可以告诉为什么吗?

因此,我的解决方案是始终将组件添加到TestController中,或通过TestController作为TestView的一个属性(因此在TestView()中,我将这样添加它们:this.parentPanel.add(comboBox)。还有其他解决方案吗?


问题答案:
  • 几乎不使用空布局
  • 而是使用嵌套在JPanels中的布局的最佳组合来为您的GUI实现令人愉悦的布局。
  • 如果您确实使用null布局,那么您将完全负责设置添加到该容器的 所有 组件的大小和位置。
  • 当前的问题是,您永远不会给TestView指定大小或位置,而是将其添加到使用空布局的容器中。
  • 您不应将一个组件(上面的JComboBox)添加到多个容器中。
  • 在添加所有组件并对其进行调用setVisible(true)之前 请勿调用JFrame pack()

例如,

import java.awt.*;
import javax.swing.*;

public class TestController extends JPanel {
   private static final int PREF_W = 1000;
   private static final int PREF_H = 800;
   TestView cgView;

   public TestController() {
      setLayout(null);
      cgView = new TestView();
      cgView.setSize(getPreferredSize());
      add(cgView);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            JFrame fr = new JFrame("testt");
            // fr.setSize(1200, 1000);
            fr.setResizable(false);
            TestController cgc = new TestController();
            fr.setBackground(Color.white);
            // fr.setVisible(true);
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fr.add(cgc);
            fr.pack(); //!! added 
            fr.setVisible(true); // !! moved
         }
      });
   }
}

但是最好使用布局:

import java.awt.*;
import javax.swing.*;

public class TestController extends JPanel {
   private static final int PREF_W = 1000;
   private static final int PREF_H = 800;
   TestView cgView;

   public TestController() {
      //!!  setLayout(null);
      cgView = new TestView();
      //!! cgView.setSize(getPreferredSize());
      add(cgView);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            JFrame fr = new JFrame("testt");
            // fr.setSize(1200, 1000);
            fr.setResizable(false);
            TestController cgc = new TestController();
            fr.setBackground(Color.white);
            // fr.setVisible(true);
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fr.add(cgc);
            fr.pack(); //!! added 
            fr.setVisible(true); // !! moved
         }
      });
   }
}

class TestView extends JPanel {
   private static final long serialVersionUID = 1L;
   public JComboBox<String> comboBox;

   public TestView() {
      comboBox = new JComboBox<String>(new String[] { "option1", "option2" });
      // comboBox.setBounds(100, 500, 100, 20);
      add(comboBox);
   }
}

编辑
OP在评论中询问:

‘几乎从不’?在哪种情况下,您会使用[null布局]?

我很少使用它,例如当我想通过动画或使用MouseListener来移动组件时,但是即使如此,许多人还是建议您创建自己的布局来处理它,例如Rob
Camick的Drag Layout。



 类似资料:
  • 有人能说出为什么组合框没有显示?我有一个控制器: 和视图 由于TestController中的setLayout(null),我看不到组合框。如果我将add(cgview.comboBox)添加到我的TestContoller()中,使其看起来如下所示: 比我能看到的还要多。有人能说出原因吗? 所以我的解决方案是始终在TestController中添加组件,或者将TestController作为a

  • 我直接从书上抄了这些例子。代码应该在JFrame上绘制一些东西,但没有显示任何东西(除了JFrame),这里是带有main方法的类 下面是JPanel的一个子类

  • 问题内容: 我有一个JFrame根据您单击的MenuItem显示JPanels。它可以工作,但是现在我需要在将JPanel添加到框架中并显示 它之后调用一个方法(因为我在该面板内使用JFreeChart,并且必须在可见JPanel时调用): 看起来还好吗?是被真出?似乎不是: 这是不工作(被 抛出异常)。这意味着 在调用repaint时,JPanel不可见,我已经测试了以下内容: 现在它可以正常工

  • 我知道同样的问题已经被问过很多次了,但是我似乎真的没有在我的代码中发现阻碍JPanel类型的对象显示在JFrame中的错误。下面是扩展JFrame的类的构造函数: 当我运行main方法(这里没有显示)时,它只显示框架和按钮。如果有人能在这方面给点提示,我会非常感谢的。

  • 问题内容: 我正在为我的学生编写MathQuiz,包括用于渲染的JLatexMath和用于蜂鸣器的jinput。问题是,有时(像每四次一样)当我启动程序时,所有组件都不可见。它们在调整JFrame大小后出现。首先,我想到了jinput或jlatexMath库中的Bug,但是即使使用最小的代码,我也会遇到相同的错误: 代码有什么问题? 问题答案: 首先移到构造函数的末尾。 而不是去这里… 移到这里…

  • 这是我的代码,当我执行时,我得到的只是一个空白窗口。首先,当我尝试执行时,我得到了这个错误: “无法对非静态字段面板进行静态引用” 所以我把它放在构造器中,但什么都不会显示。