在设置布局之外添加元素(即JLabel)

时间:2013-04-04 15:42:45

标签: java swing layout jpanel layout-manager

作为项目的一部分,我们必须有9个盒子,在这里我只是用交替的颜色作为例子代替我们应该使用的图像。但是,虽然我想在这个网格JLabels中使用这9个layout (3,3),但我还希望在顶部显示一条消息(JLabel),我可以集中处理,就像欢迎消息一样下面有四个JButtons?有人可以指点我如何实现这个目标吗?

谢谢!

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

class HomeController extends JPanel implements MouseListener
{
    HomeController()
    {
        setLayout(new GridLayout(3,3));

        JLabel apl1 = new JLabel("");
        apl1.setBackground(Color.WHITE);
        apl1.setOpaque(true);
        this.add(apl1);

        JLabel apl2 = new JLabel("");
        apl2.setBackground(Color.BLACK);
        apl2.setOpaque(true);
        this.add(apl2);

        JLabel apl3 = new JLabel("");
        apl3.setBackground(Color.WHITE);
        apl3.setOpaque(true);
        this.add(apl3);

        JLabel apl4 = new JLabel("");
        apl4.setBackground(Color.BLACK);
        apl4.setOpaque(true);
        this.add(apl4);

        JLabel apl5 = new JLabel("");
        apl5.setBackground(Color.WHITE);
        apl5.setOpaque(true);
        this.add(apl5);

        JLabel apl6 = new JLabel("");
        apl6.setBackground(Color.BLACK);
        apl6.setOpaque(true);
        this.add(apl6);

        JLabel apl7 = new JLabel("");
        apl7.setBackground(Color.WHITE);
        apl7.setOpaque(true);
        this.add(apl7);

        JLabel apl8 = new JLabel("");
        apl8.setBackground(Color.BLACK);
        apl8.setOpaque(true);
        this.add(apl8);

        JLabel apl9 = new JLabel("");
        apl9.setBackground(Color.WHITE);
        apl9.setOpaque(true);
        this.add(apl9);

        JLabel message = new JLabel("hello world");
        this.add(message);
    }
}

1 个答案:

答案 0 :(得分:1)

您可以组合使用不同布局的多个面板。有关详细信息,请查看A Visual Guide to Layout Managers

例如,JFrame的默认布局为BorderLayout。使用BorderLayout,您可以将标题置于BorderLayout.NORTH,面板上的按钮位于BorderLayout.SOUTH,面板上的标签网格位于BorderLayout.CENTER。每个面板可能都有自己更复杂的布局。例如,标签网格使用GridLayout,按钮面板使用FlowLayout

这是一个基于发布代码的非常简单的示例,演示了这种方法:

enter image description here

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

public class TestGrid {
    public TestGrid() {
        final JFrame frame = new JFrame("Grid");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel(new GridLayout(3, 3));

        for (int idx = 0; idx < 9; idx++) {
            JLabel label = new JLabel();
            label.setBackground(idx % 2 == 0 ? Color.WHITE : Color.BLACK);
            label.setOpaque(true);
            mainPanel.add(label);
        }
        mainPanel.setPreferredSize(new Dimension(200, 200));
        frame.add(mainPanel, BorderLayout.CENTER);

        frame.add(new JLabel("Title", JLabel.CENTER), BorderLayout.NORTH);

        JPanel buttonsPanel = new JPanel();
        buttonsPanel.add(new JButton("Start"));
        buttonsPanel.add(new JButton("Stop"));
        frame.add(buttonsPanel, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestGrid();
            }
        });
    }
}