Java 如何在一个框架中添加两个布局不同的面板?

Java 如何在一个框架中添加两个布局不同的面板?,java,swing,jframe,layout-manager,gridbaglayout,Java,Swing,Jframe,Layout Manager,Gridbaglayout,我有一个面板带有gridBagLayout,第二个面板带有null gridBagLayout。当我将其添加到主面板,并且主面板到框架时,一个面板将消失。为什么呢?如何在一个框架中添加两个具有不同布局设置的面板 以下是@Beowolve的主要代码: import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import javax.swing.JButton;

我有一个面板带有gridBagLayout,第二个面板带有null gridBagLayout。当我将其添加到主面板,并且主面板到框架时,一个面板将消失。为什么呢?如何在一个框架中添加两个具有不同布局设置的面板

以下是@Beowolve的主要代码:

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PrikazGUI {

    JFrame frejm;
    JPanel k;
    JButton b1,b2;

    public PrikazGUI(){
        frejm = new JFrame("Lala");
        k = new JPanel();

        KvadratPravi p = new KvadratPravi();
        JPanel grid = new JPanel();
        grid.setLayout(new GridBagLayout());
        grid.add(p);
//      Kvadrat l = new Kvadrat();
        JosJedanKvadrat jos = new JosJedanKvadrat();
//      k.setLayout(null);
//      k.setBounds(0, 444,444, 445);
        k.add(jos);
        k.add(grid);
        JPanel main = new JPanel();
        main.setLayout(null);
        k.setBounds(0, 0,1000, 1900);
        main.setBounds(0, 0,1000, 1900);
        main.add(k);



        frejm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frejm.setSize(1900, 1000);
        frejm.getContentPane().add(main);
//      frejm.getContentPane().add(k);
//      frejm.pack();
        frejm.setVisible(true);


    }


    public static void main(String[] args) {
        PrikazGUI a = new PrikazGUI();

    }

}
二等舱:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JPanel;

public class KvadratPravi extends JPanel {

    int sizeH = 60;
    int sizeW = 60;
    public GridBagConstraints cst = new GridBagConstraints();

    public KvadratPravi() {
        JPanel j = new JPanel();
        j.setLayout(new GridBagLayout());
         cst.gridx = 0;
         cst.gridy = 0;

         add(j,cst);

    }



    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponent(g);
            g.setColor(Color.PINK);
           g.drawRect(0, 0, sizeH, sizeW);
           g.fillRect(0, 0, sizeH, sizeW);
    }

     @Override
     public Dimension getPreferredSize() {
         return new Dimension(sizeH,sizeW);
     }

}
三等舱:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JPanel;

public class JosJedanKvadrat extends JPanel {

    int sizeH = 60;
    int sizeW = 60;
    int x,y;


     public JosJedanKvadrat() {

         setBounds(33, 44,444, 445);
         JPanel j = new JPanel();

         setLayout(null);

         add(j);
         addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                if(!e.isMetaDown()){
                x = e.getX();
                y = e.getY();
                }
                }
                });
                addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseDragged(MouseEvent e) {
                if(!e.isMetaDown()){
                Point p = getLocation();
                setLocation(p.x + e.getX() - x,
                p.y + e.getY() - y);
                }
                }
                });



    }



    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponent(g);
            g.setColor(Color.BLUE);
           g.drawOval(0, 0, sizeH, sizeW);


    }

     @Override
     public Dimension getPreferredSize() {
         return new Dimension(sizeH,sizeW);
     }

}

第二类是在面板的中心,有gridBagLayout,第三类是在物体周围移动,因此,该类没有gridlayout…当我和主窗格中的两个面板时,第二个类的gridBagLayout似乎不起作用。

您当前正在将两个
JPanel
添加到
JFrame

JFrame f = new JFrame();

默认情况下,此框架使用。因此,如果调用
f.add(newpanel())多次只有最后一个将可见,因为此布局的
中心
区域只能显示一个
JComponent
。您需要使用不同的布局。

请添加小样本代码以显示您的问题。您对问题的解释不是很清楚。@Beowolve这里是代码:)不要使用空布局。Swing设计用于布局管理器。此外,无论何时进行自定义绘制,都需要覆盖组件的
getPreferredSize()
方法,以便布局管理器知道组件的所需大小。不要硬编码框架的大小。pack()方法将根据添加到框架中的组件的首选大小调整框架的大小。
您需要使用不同的布局。
-或者将第二个组件添加到BorderLayout的不同区域。例如
add(component,BorderLayout.PAGE_END)
@camickr我更喜欢使用其他布局,因为我不确定这些面板的内容。我更喜欢看到边框布局来设置边框内容:菜单、页脚、页眉。但我应该提到这一点。其实已经不重要了