2

我想JPanel在 java 中创建一个布局类似于下面的布局。有任何想法吗?

在此处输入图像描述

4

5 回答 5

8

使用垂直BoxLayout并设置每行项目的对齐方式。(让每一行都有自己的JPanel

另一种选择是使用 aSpringLayout或 aGridBoxLayout并为每个缩进设置间距。

于 2011-04-22T12:03:46.527 回答
2

看看miglayout。使用此布局管理器,您将永远不必询问在特定情况下使用哪个布局管理器 :-)

于 2011-04-22T12:22:53.617 回答
1

这是使用jgoodies 表单FormLayout 的实现(来自 google 的库):

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

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

public class FormSample {

    private static JPanel generatePanel() {

        FormLayout layout = new FormLayout(
                "3dlu, 15dlu, max(50dlu;p), 2dlu, p, 3dlu", // column definition
                "5dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 5dlu" // row definition
        );

        JPanel panel = new JPanel(layout);

        CellConstraints cc = new CellConstraints();
        int row = 0;
        panel.add(new JLabel("Amplitude"), cc.xyw(2, row * 4 + 2, 4));
        panel.add(new JTextField(), cc.xy(3, row * 4 + 4));
        panel.add(new JLabel("V"), cc.xy(5, row * 4 + 4));
        row++;
        panel.add(new JLabel("Off-set"), cc.xyw(2, row * 4 + 2, 4));
        panel.add(new JTextField(), cc.xy(3, row * 4 + 4));
        panel.add(new JLabel("V"), cc.xy(5, row * 4 + 4));
        row++;
        panel.add(new JLabel("Frequentie"), cc.xyw(2, row * 4 + 2, 4));
        panel.add(new JTextField(), cc.xy(3, row * 4 + 4));
        panel.add(new JLabel("Hz"), cc.xy(5, row * 4 + 4));
        row++;
        panel.add(new JLabel("Fase"), cc.xyw(2, row * 4 + 2, 4));
        panel.add(new JTextField(), cc.xy(3, row * 4 + 4));
        panel.add(new JLabel("rad"), cc.xy(5, row * 4 + 4));

        return panel;
    }


    public static void main(String[] args) {
        // create frame
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // add content panel
        frame.setContentPane(generatePanel());

        // shring/expand to optimal size
        frame.pack();

        // center frame
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension resolution = toolkit.getScreenSize();
        Dimension frameSize = frame.getSize();
        int xLocation = resolution.width / 2 - frameSize.width / 2;
        int yLocation = resolution.height / 2 - frameSize.height / 2;
        frame.setLocation(xLocation, yLocation);

        // show frame
        frame.setVisible(true);
    }
}
于 2011-04-22T12:29:28.497 回答
0

我与GroupLayout经理创建了一个示例。缩进组件是使用LayoutStyle.ComponentPlacement.INDENT 组件放置类型创建的。

package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.Alignment.BASELINE;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;


public class GroupLayoutIndent extends JFrame {

    public GroupLayoutIndent() {

        initUI();

        setTitle("Indents");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        JLabel ampLbl = new JLabel("Amplitude");
        JLabel offLbl = new JLabel("Off-set");
        JLabel freqLbl = new JLabel("Frequency");
        JLabel phsLbl = new JLabel("Phase");
        JLabel unit1 = new JLabel("V");
        JLabel unit2 = new JLabel("V");
        JLabel unit3 = new JLabel("Hz");
        JLabel unit4 = new JLabel("rad");

        JTextField field1 = new JTextField(12);
        JTextField field2 = new JTextField(12);
        JTextField field3 = new JTextField(12);
        JTextField field4 = new JTextField(12);

        gl.setAutoCreateGaps(true);
        gl.setAutoCreateContainerGaps(true);

        gl.setHorizontalGroup(gl.createParallelGroup()
                .addComponent(ampLbl)
                .addGroup(gl.createSequentialGroup()
                        .addPreferredGap(ampLbl, field1,
                                LayoutStyle.ComponentPlacement.INDENT)
                        .addComponent(field1)
                        .addComponent(unit1))
                .addComponent(offLbl)
                .addGroup(gl.createSequentialGroup()
                        .addPreferredGap(offLbl, field2,
                                LayoutStyle.ComponentPlacement.INDENT)
                        .addComponent(field2)
                        .addComponent(unit2))
                .addComponent(freqLbl)
                .addGroup(gl.createSequentialGroup()
                        .addPreferredGap(freqLbl, field3,
                                LayoutStyle.ComponentPlacement.INDENT)
                        .addComponent(field3)
                        .addComponent(unit3))     
                .addComponent(phsLbl)
                .addGroup(gl.createSequentialGroup()
                        .addPreferredGap(phsLbl, field4,
                                LayoutStyle.ComponentPlacement.INDENT)
                        .addComponent(field4)
                        .addComponent(unit4))                 
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(ampLbl)
                .addGroup(gl.createParallelGroup(BASELINE)
                        .addComponent(field1)
                        .addComponent(unit1))
                .addComponent(offLbl)
                .addGroup(gl.createParallelGroup(BASELINE)
                        .addComponent(field2)
                        .addComponent(unit2))   
                .addComponent(freqLbl)
                .addGroup(gl.createParallelGroup(BASELINE)
                        .addComponent(field3)
                        .addComponent(unit3))
                .addComponent(phsLbl)
                .addGroup(gl.createParallelGroup(BASELINE)
                        .addComponent(field4)
                        .addComponent(unit4))
        );

        gl.linkSize(field1, field2, field3, field4);

        pack();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroupLayoutIndent ex = new GroupLayoutIndent();
                ex.setVisible(true);
            }
        });
    }
}

GroupLayout 缩进

于 2014-07-30T14:47:41.723 回答
-1

GroupLayout 是 NetBeans(以及其他一些 IDE,如果我没记错的话)中 GUI 设计工具的默认布局管理器。

于 2012-02-07T18:05:40.777 回答