【问题标题】:How to add sequence of JLabels right below each other?如何在彼此正下方添加 JLabels 序列?
【发布时间】:2019-03-22 19:23:04
【问题描述】:

我刚刚在我的 GUI 中添加一系列 JLabel 时遇到了一些问题。例如,我需要将 9 个 JLabel 显示在屏幕左侧的正下方。 这是我到目前为止得到的:

公共 MeatPanel() {

    JLabel label1 = new JLabel("Meat");
    JLabel label2 = new JLabel("Bacon");
    JLabel label3 = new JLabel("Capicola");
    JLabel label4 = new JLabel("Hamburger");
    JLabel label5 = new JLabel("Pepperoni");
    JLabel label6 = new JLabel("Meatball");
    JLabel label7 = new JLabel("Sausage");
    JLabel label8 = new JLabel("Chicken");
    JLabel label9 = new JLabel("Linguica");


    add(label1, BorderLayout.WEST);
    add(label2, BorderLayout.WEST);
    add(label3, BorderLayout.WEST);
    add(label4, BorderLayout.WEST);
    add(label5, BorderLayout.WEST);
    add(label6, BorderLayout.WEST);
    add(label7, BorderLayout.WEST);
    add(label8, BorderLayout.WEST);
    add(label9, BorderLayout.WEST);
    setLayout(new BorderLayout(9,0));

}

但是,它们只是彼此相邻显示。我怎样才能使它们在彼此下方,就像在列表中一样?

【问题讨论】:

  • 你看过这个answer
  • 所以如果你直接需要帮助可以关注this教程

标签: java swing layout-manager


【解决方案1】:

Laying Out Components Within a Container开头。

您不会拘泥于一个容器/布局,您可以将它们组合起来以生成复杂的 UI。

在您的示例中,您尝试将多个组件添加到容器的 WEST 位置,但 BorderLayout 仅支持在其 5 个可用位置中的每一个位置管理单个组件。

另外,在大多数情况下,您应该在尝试将组件添加到容器之前设置布局管理器

以下是使用复合组件/布局生成复杂 UI 的常用方法

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                // This is just a filler
                frame.add(new JPanel() {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(200, 200);
                    }
                });
                frame.add(new MenuPane(), BorderLayout.WEST);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MenuPane extends JPanel {

        public MenuPane() {
            setLayout(new GridLayout(0, 1));
            add(new JLabel("Meat"));
            add(new JLabel("Bacon"));
            add(new JLabel("Capicola"));
            add(new JLabel("Hamburger"));
            add(new JLabel("Pepperoni"));
            add(new JLabel("Meatball"));
            add(new JLabel("Sausage"));
            add(new JLabel("Chicken"));
            add(new JLabel("Linguica"));
        }

    }

}

【讨论】:

    【解决方案2】:

    您可以使用 BoxLayout 更多信息:https://docs.oracle.com/javase/tutorial/uiswing/layout/box.html

    JPanel panel= new JPanel();
    BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.X_AXIS);// from left to rigth  
    panel.setLayout(boxlayout); 
    
    JLabel label1 = new JLabel("Meat");
    JLabel label2 = new JLabel("Bacon");
    JLabel label3 = new JLabel("Capicola");
    JLabel label4 = new JLabel("Hamburger");
    ...
    panel.add(label1);
    panel.add(label2);
    panel.add(label3);
    panel.add(label4);
    ...
    
    frame.add(panel);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多