当前位置: 首页 > 知识库问答 >
问题:

JPanel上的组件在setLayout(null)时不显示

管杜吟
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.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),我看不到组合框。如果我将add(cgview.comboBox)添加到我的TestContoller()中,使其看起来如下所示:

public TestController() 
    {

        setLayout(null);

        cgView=new TestView();

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

    }

比我能看到的还要多。有人能说出原因吗?

所以我的解决方案是始终在TestController中添加组件,或者将TestController作为atribute传递给TestView(所以在TestView()中,我会像这样添加它们,this.parentPanel.add(comboBox)。还有其他解决方案吗?

共有1个答案

岳高明
2023-03-14
  • 几乎永远不要使用空布局
  • 相反,使用嵌套在JPanels中的布局的最佳组合来为您的GUI实现令人满意的布局。
  • 如果确实使用空布局,则您将完全负责设置添加到该容器的所有组件的大小和位置。
  • 当前的问题是,您从未为TestView提供大小或位置,然后将其添加到空的使用布局的容器中。
  • 您不应该将组件(如上,您的JComboBox)添加到多个容器中。
  • 在添加所有组件并对其调用pack()之前,不要对JFrame调用setVisible(true)

例如,

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

编辑
注释中询问的操作:

“几乎从来没有”?在哪些情况下您会使用它[空布局]?

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

 类似资料:
  • 问题内容: 有人可以告诉我为什么组合框不显示吗?我有一个控制器: 和一个观点 由于TestController中的 setLayout(null) ,我看不到comboBox。如果我将 add(cgView.comboBox)添加 到TestContoller()中,则它看起来像这样: 比我能看到的。有人可以告诉为什么吗? 因此,我的解决方案是始终将组件添加到TestController中,或通过

  • 我有一个扩展JFrame的类。它使用以下代码将180个图像加载到数组中 更新:我尝试使用一个JLabel而不是我的ImagePanel类。JLabel似乎也有同样的问题。当我使用JPEG时,它会显示,但当我使用PNG时,它什么也不显示。

  • 我有一个JTextArea,它位于JScrollPane中,而JScrollPane又位于JPanel中,而JTextArea又位于JTabbedPane的Tab中。 我知道文本被添加到我的JTextArea中,但是当我在选项卡之间移动时,JTextArea是不可见的。要阅读文本,我必须选择JTextArea中的文本,然后将JTextArea的背景设置为白色。如果我不选择,我什么也看不到。 下面是

  • 我希望有人能帮我解决以下问题。我正在创建一个Java桌面应用程序,其中有一个包含两个JPanel的JPanel topicPanel;TopicButton面板包含JButton createEntryButton和topicTabCardsPanel,后者实现CardLayout。单击createEntryButton时,我试图动态创建并添加一个新的JPanel entryPanel,其中包含J

  • 问题内容: 在JPanel上显示jpg图像(从本地文件夹加载)的最合适的图像类型是什么? 干杯。 问题答案: