FlowLayout中不显示组件,而网格布局呢?(FlowLayout not displaying

2019-06-25 13:11发布

I'm making an application to act as a hub of some sorts, where the user can store shortcuts to their favorite applications and easily launch them. I'm having some problems with FlowLayout, though. When I use GridLayout, the components display perfectly. When I use FlowLayout, nothing displays at all.

GridLayout:

FlowLayout:

All I have changed is the LayoutManager. When I call getComponentCount, they both respond with 9.

I thought this post was pretty long, so I put a snippet of my code on Code Tidy (from Pastebin)

Thank you in advance for your help!

Answer 1:

1) FlowLayout漂亮接受PreferredSize是从哪里来JComponent ,每个JComponents能已经得到不同Dimension的屏幕上

例如(uncomnent getMinimumSizegetMinimumSize

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

public class CustomComponent extends JFrame {

    private static final long serialVersionUID = 1L;

    public CustomComponent() {
        setTitle("Custom Component Test / BorderLayout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
    }

    public void display() {
        add(new CustomComponents0(), BorderLayout.NORTH);
        add(new CustomComponents0(), BorderLayout.CENTER);
        add(new CustomComponents0(), BorderLayout.SOUTH);
        add(new CustomComponents0(), BorderLayout.EAST);
        pack();
        // enforces the minimum size of both frame and component
        setMinimumSize(getMinimumSize());
        setPreferredSize(getPreferredSize());
        setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                CustomComponent main = new CustomComponent();
                main.display();
            }
        };
        javax.swing.SwingUtilities.invokeLater(r);
    }
}

class CustomComponents0 extends JLabel {

    private static final long serialVersionUID = 1L;

    /*@Override
    public Dimension getMinimumSize() {
    return new Dimension(200, 100);
    }

    @Override
    public Dimension getPreferredSize() {
    return new Dimension(300, 200);
    }*/
    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}

2) GridLayou吨每创建比例面积JComponents ,然后只接受JComponent已经得到了较大的Dimnesion从哪里来PreferredSize

3) GridLayout我说的方法, pack()如果是不存在JFrame#setSize()FLowLayout不要紧,



Answer 2:

嗯,我知道这已经回答了,但我想补充,如果你看一下下面的代码并运行它,它会创建9个标签和4个按键,并使用流布局添加它们,但与帧大小低于这个例子使用设置setSize(int width,int height)

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class FlowLayoutTest extends JFrame {

    private JPanel NorthPanel, SouthPanel;
    private JLabel[] labels;
    private JButton[] buttons;

    public FlowLayoutTest() {
        createAndShowUI();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                FlowLayoutTest flowLayoutTest = new FlowLayoutTest();
            }
        });
    }

    private void createAndShowUI() {
        setTitle("Flow layout");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        initializeComponents();
        addComponents(this.getContentPane());

        //pack();

        setVisible(true);
    }

    private void initializeComponents() {

        labels = new JLabel[9];
        for (int i = 0; i < labels.length; i++) {
            labels[i] = new JLabel("Label " + (i+1));
        }
        buttons = new JButton[4];
        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton("Button " + (i+1));
        }

        NorthPanel = new JPanel(new FlowLayout(5));
        SouthPanel = new JPanel(new FlowLayout(5));
    }

    private void addComponents(Container contentPane) {

        for (int i = 0; i < buttons.length; i++) {
            SouthPanel.add(buttons[i]);
        }

        for (int i = 0; i < labels.length; i++) {
            NorthPanel.add(labels[i]);
        }

        contentPane.add(NorthPanel, BorderLayout.NORTH);
        contentPane.add(SouthPanel, BorderLayout.SOUTH);
    }
}

然而,当你运行你会注意到一个标签(9号)已经关闭屏幕的应用,这是因为setSize()使用,但是如果我们所说的(或在这种情况下,取消注释) pack()的框架设置为可见之前,你将能看到太多的框架上的所有组件。



文章来源: FlowLayout not displaying components while GridLayout does?