【问题标题】:How to add two panels with different layouts in one frame? [duplicate]如何在一帧中添加两个布局不同的面板? [复制]
【发布时间】:2017-01-24 14:12:47
【问题描述】:

我有一个带有 gridBagLayout 的面板,第二个带有 null gridlayout。当我将它添加到主面板时,主面板框架一个面板就会消失。这是为什么?以及如何在一帧中添加两个具有不同布局设置的面板?

这是代码主@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,而第三类我想要在对象周围移动,这样该类就没有网格布局......当我和两个面板到主窗格时,它似乎第二类 whit gridBagLayout 不起作用。

【问题讨论】:

  • 请添加小示例代码以显示您的问题。您对问题的解释不是很清楚。
  • @Beowolve 现在是代码 :)
  • 不要使用空布局。 Swing 旨在与布局管理器一起使用。此外,每当您进行自定义绘画时,您都需要覆盖组件的getPreferredSize() 方法,以便布局管理器知道组件的所需大小。不要硬编码框架的大小。 pack() 方法将根据添加到框架的组件的首选大小来调整框架的大小。

标签: java swing jframe layout-manager gridbaglayout


【解决方案1】:

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

JFrame f = new JFrame();

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

【讨论】:

  • You need to use a different layout. - 或者将第二个组件添加到 BorderLayout 的不同区域。例如add(component, BorderLayout.PAGE_END)
  • @camickr 我更喜欢使用其他布局,因为我不确定这些面板的内容。而且我更喜欢看边框布局来设置边框内容:菜单、页脚、页眉。但我应该提到这一点。好吧,这真的不重要了
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 2021-06-27
  • 2013-06-09
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多