1

我正在做一个演示 Swing GUI 的小测试。在这个演示中,JFrame由 3 个“master”组成JPanel。如果您愿意,第一个 ( jp1) 由JLabels 组成,另外两个由其他几个JPanels 组成。我正在使用 MigLayout。

这是我的示例代码:

    // All the jPanels  
    JFrame frame = new JFrame();
    frame.setLayout(new MigLayout());
    JPanel jp1 = new JPanel();
    jp1.setLayout(new MigLayout());
    jp1.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
    JPanel jp2 = new JPanel();
    jp2.setLayout(new MigLayout());
    jp2.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
    JPanel jp3 = new JPanel();
    jp3.setLayout(new MigLayout());
    jp3.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
    JPanel jp4 = new JPanel();
    jp4.setLayout(new MigLayout());
    jp4.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
    JPanel jp5 = new JPanel();
    jp5.setLayout(new MigLayout());
    jp5.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
    JPanel jp6 = new JPanel();
    jp6.setLayout(new MigLayout());
    jp6.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
    JPanel jp7 = new JPanel();
    jp7.setLayout(new MigLayout());
    jp7.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));

    JPanel bigPanel1 = new JPanel();
    bigPanel1.setLayout(new MigLayout());
    bigPanel1.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));

    JPanel bigPanel2 = new JPanel();
    bigPanel2.setLayout(new MigLayout());
    bigPanel2.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
    //All the labels to be added to JPanel jp1
    JLabel label1 = new JLabel();
    label1.setText("LABEL1");
    JLabel label2 = new JLabel();
    label2.setText("LABEL2");
    JLabel label3 = new JLabel();
    label3.setText("LABEL3");
    JLabel label4 = new JLabel();
    label4.setText("LABEL4");
    jp1.add(label1);
    jp1.add(label2);
    jp1.add(label3);
    jp1.add(label4,"wrap");
    bigPanel1.add(jp2);
    bigPanel1.add(jp6);
    bigPanel1.add(jp3,"grow,wrap");
    bigPanel2.add(jp4);
    bigPanel2.add(jp7);
    bigPanel2.add(jp5,"grow,wrap");
    frame.getContentPane().add(jp1,"dock north, wrap");
    frame.getContentPane().add(bigPanel1,"span,grow,wrap");
    frame.getContentPane().add(bigPanel2,"span,grow,wrap");
    frame.pack();
    frame.setVisible(true);

导致此输出:GUI OUTPUT

我想要实现的是能够将标签添加到第一个JPanel( jp1) 中而不会弄乱其余部分JPanel的宽度。另外,我想让JPanela 内的几个 s占据其全宽,bigPanel以及 in和fill 。jp2jp6jp3bigPanel1

我该怎么做?提前致谢。

4

2 回答 2

3

我从来没有使用过MigLayout,如果可以使用默认 java 来完成,我个人不明白原因LayoutManager

好的,所以我使用了一个组合FlowLayoutGridBagLayout实现这一点,以及 gc.fill=GridBagConstraints.NONE我们gc.anchor=GridBagConstraints.WEST不想填充内容窗格宽度的那些面板也根据您的评论进行更新,以阻止JPanel/在添加更多 sJFrame时大于给定的最大宽度JLabel这是使用 a 完成的JScrollPane

在此处输入图像描述

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

public class Test {

    public Test() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLayout(new GridBagLayout());

        final JPanel labelPanel = new JPanel();
        labelPanel.setBorder(new LineBorder(Color.black));
        for (int i = 0; i < 5; i++) {
            labelPanel.add(new JLabel("Label" + (i + 1)));
        }

        final int maxWidth = 200;
        final JScrollPane jsp = new JScrollPane(labelPanel) {
            @Override
            public Dimension getPreferredSize() {
                //we set the height by checking if we exceeed the wanted ith thus a scrollbar will appear an we must incoprate that or labels wont be shpwn nicely
                return new Dimension(maxWidth, labelPanel.getPreferredSize().width < maxWidth ? (labelPanel.getPreferredSize().height + 5) : ((labelPanel.getPreferredSize().height + getHorizontalScrollBar().getPreferredSize().height) + 5));
            }
        };

        JPanel otherPanel = new JPanel();
        otherPanel.add(new JLabel("label"));
        otherPanel.setBorder(new LineBorder(Color.black));

        JPanel otherPanel2 = new JPanel();
        otherPanel2.add(new JLabel("label 1"));
        otherPanel2.add(new JLabel("label 2"));
        otherPanel2.setBorder(new LineBorder(Color.black));

        GridBagConstraints gc = new GridBagConstraints();

        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 1.0;
        gc.weighty = 1.0;
        gc.gridx = 0;
        gc.gridy = 0;
        frame.add(jsp, gc);

        gc.fill = GridBagConstraints.NONE;
        gc.anchor = GridBagConstraints.WEST;
        gc.gridy = 1;
        frame.add(otherPanel, gc);
        gc.anchor = GridBagConstraints.WEST;
        gc.gridy = 2;
        frame.add(otherPanel2, gc);

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

    public static void main(String[] args) {
        //Create Swing components on EDT
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }
}
于 2013-01-30T18:45:59.120 回答
3

我有使用BorderLayoutFlowLayout管理布局。框架有两个JPanel's,一个JPanel里面还有两个JPanel's。所有内部面板都FlowLayout用于对齐JLabels. 将这些面板排列在JFrame我用过的BorderLayout.

布局管理器

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

public class LayoutTest {

    public LayoutTest() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLayout(new GridBagLayout());

        JPanel motherPanel = new JPanel(new BorderLayout());

        JPanel topPanel = new JPanel(new BorderLayout());
        JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));

        motherPanel.add(topPanel, BorderLayout.NORTH);
        motherPanel.add(bottomPanel, BorderLayout.CENTER);

        JPanel topUpperPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel topBottomPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));

        topUpperPanel.setBorder(new LineBorder(Color.BLACK));
        topBottomPanel.setBorder(new LineBorder(Color.BLACK));
        bottomPanel.setBorder(new LineBorder(Color.BLACK));

        topPanel.add(topUpperPanel, BorderLayout.PAGE_START);
        topPanel.add(topBottomPanel, BorderLayout.CENTER);

        for(int i = 0; i < 3; i++) {
            JLabel label = new JLabel("Label-" + String.valueOf(i));
            label.setBorder(new LineBorder(Color.BLACK));
            topUpperPanel.add(label);
        }

        for(int i = 0; i < 2; i++) {
            JLabel label = new JLabel("Label-" + String.valueOf(i));
            label.setBorder(new LineBorder(Color.BLACK));
            topBottomPanel.add(label);
        }

        for(int i = 0; i < 5; i++) {
            JLabel label = new JLabel("Label-" + String.valueOf(i));
            label.setBorder(new LineBorder(Color.BLACK));
            bottomPanel.add(label);
        }

        frame.add(motherPanel);
        frame.setTitle("Layout Manager");
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LayoutTest();
            }
        });
    }
}

PS:我建议您将面板分开,以便“不会干扰剩余的 JPanel”。

于 2013-01-30T19:14:45.360 回答