【问题标题】:Custom Swing layout自定义 Swing 布局
【发布时间】:2015-08-11 17:01:06
【问题描述】:

我正在创建一个游戏并按照我想要的方式设置框架,我需要一些如何创建服装布局的知识。我尝试创建多个具有不同布局的面板,例如流和边框,并在主面板上添加面板,但我仍然没有得到想要的结果。我想要的显示在附图中。请告诉我是否有任何代码段有帮助。
问题: 1. 有可能得到这样的布局吗? (我希望它被修复。)

  1. 在“按钮”下有您在图片中看到的 JLabel。我希望它的文本从左边开始,沿着列向下,从中间开始,然后到右列。这可能吗?

【问题讨论】:

  • 这个布局很简单,如果我没记错的话。只需将JPanelBorderLayout 作为根。现在将JPanel 添加到PAGE_START 位置,使用BoxLayout,将另一个JPanel 添加到CENTER,使用GridLayout。这会做:-)
  • 噢,太聪明了。如果我使用 q 网格布局,现在文本是否会保留在标签上并沿着行向下移动到一列?
  • 对于 2. 你不使用JLabel,你使用JPanelGridLayout
  • @PTheCoolGuy 使用JListVERTICAL_WRAP(通过setLayoutOrientation)方法,在How to Use Lists 中演示...对于底部的“标签”
  • 令人惊讶的是,JListListCellRender 之间几乎可以做任何事情,让它看起来随心所欲,但是是的,正如教程所示,文本是最简单的;)

标签: java swing layout-manager


【解决方案1】:

关于我在 cmets 中写的内容略有不同,因为 BoxLayout 是一些东西,我从不使用它,因为我不擅长它:-)

虽然我做了什么来克服,但我的这个缺点是取2个JPanels,JTextFieldJButton各一个,其余的都是一样的,如下例所示:

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

public class LayoutExample {    

    private static final int GAP = 5;
    private static final int TOTAL_LABELS = 18;

    private JTextField tField;
    private JButton button;
    private JLabel[] labels;

    private void displayGUI () {
        JFrame frame = new JFrame ( "Layout Example" );
        frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );

        JPanel contentPane = getPanel ();
        contentPane.setLayout ( new BorderLayout ( GAP, GAP ) );

        JPanel headerPanel = getPanel ();
        headerPanel.setLayout ( new GridLayout ( 0, 1, GAP, GAP ) );
        JPanel textFieldPanel = getPanel ();
        tField = new JTextField ( 10 );
        textFieldPanel.add ( tField );
        JPanel buttonPanel = getPanel ();
        button = new JButton ( "Button" );
        buttonPanel.add ( button );     
        headerPanel.add ( textFieldPanel );
        headerPanel.add ( buttonPanel );
        contentPane.add (headerPanel, BorderLayout.PAGE_START );

        JPanel centerPanel = getPanel ();
        centerPanel.setLayout ( new GridLayout ( 0, 3, GAP, GAP ) );
        labels = new JLabel [ TOTAL_LABELS ];
        for ( int i = 0; i < labels.length; ++i ) {
            labels [ i ] = new JLabel ( String.valueOf ( i ), JLabel.CENTER );
            centerPanel.add ( labels [ i ] );
        }
        contentPane.add ( centerPanel, BorderLayout.CENTER );


        frame.setContentPane ( contentPane );
        frame.pack ();
        frame.setLocationByPlatform ( true );
        frame.setVisible ( true );
    }

    private JPanel getPanel () {
        JPanel panel = new JPanel ();
        panel.setOpaque ( true );
        panel.setBorder ( BorderFactory.createEmptyBorder ( GAP, GAP, GAP, GAP ) );

        return panel;
    }

    public static void main ( String[] args ) {
        Runnable runnable = new Runnable () {
            @Override
            public void run () {
                new LayoutExample ().displayGUI ();
            }
        };
        EventQueue.invokeLater ( runnable );
    }
}

输出:

【讨论】: