使用MigLayout将两个组件叠加在一起

时间:2014-08-18 16:16:30

标签: java swing user-interface miglayout

我正在尝试获得两个组件,

    frame.getContentPane().setLayout(new MigLayout("", "[53px,grow][57px][grow]", "[23px][][][]"));

    JTextPane itemTitle = new JTextPane();
    frame.getContentPane().add(itemTitle,"cell 0 4,alignx left,aligny top");
    itemTitle.setVisible(true);
    itemTitle.setMinimumSize(new Dimension(50, 50));

    List choices = new List();
    frame.add(choices, "cell 0 4,alignx left,aligny top");
    choices.setVisible(true);

在同一个地方,但所有的情况都是这样:

https://i.imgur.com/0O9A8tk.png

在itemTitle和选项中突出显示的两个组件。 我的目标是让上面的按钮将“setVisible”设置为true,将另一个设置为false。他们永远都不会是真的。如何在一个单元格中同时获得两个组件?它也使我的上面的按钮不合适,我不太清楚为什么。我在上面提到了涉及这两个组件的重要代码,如果你请求,我可以把完整的GUI代码。

我发现了这个:Fill Entire Cell With Two Components Using MigLayout然而它已经过了几年了,说实话,我不明白这个解决方案。 我有点学习,我以前从未使用过MigLayout。我应该使用不同的布局吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

  

在同一个地方......我的目标是让上面的按钮设置为“setVisible”为true而另一个为false。他们永远都不会是真的

然后你应该使用包含这两个组件的JPanel。然后在该面板上使用Card Layout并使用CardLayout确定在任何给定时间哪个组件可见。可以使用MigLayout将此面板添加到面板中,就像任何其他组件一样。

List choices = new List();

在我看来,您正在使用AWT组件。您应该将JList用于Swing应用程序。

答案 1 :(得分:-1)

  

我应该使用不同的布局吗?

不,坚持MigLayout。您选择了正确的布局管理器。 我建议你花一些时间来学习这位经理;创造情侣 通过较小的实际例子,了解这一点的众多限制 经理提供。

  

它也使我的上面的按钮不合适,我不太清楚为什么。

MigLayout是基于网格的布局管理器。 (其最重要的模式是。) 创建新按钮和打开按钮之间的差距是因为 突出显示的组件和“新建”按钮组成一列。列宽 由最大单元的宽度决定。为了绕过这个,我们可以 使用split约束。 (通常与span约束结合使用。) 在我的例子中,我使用这种技术将两个按钮居中 目前可见的标签。 如果我们不确定布局中的某些内容,我们可以使用 debug布局约束,用于绘制网格和边界的线条 组件。

frame.getContentPane().setLayout(new MigLayout("", "[53px,grow][57px][grow]", "[23px][][][]"));

不要以像素为单位设置边界。你没有使用其中一个 这位经理最重要的优势 - 解决方案的独立性和 DPI。以像素为单位的边界不可移植。按钮之间的3px间隙在较小的屏幕上看起来不错,但在较大的屏幕上是不可接受的。 MigLayout提供了多种选项供您选择,包括相关和无关的差距,逻辑像素,点数或厘米。

itemTitle.setMinimumSize(new Dimension(50, 50));

通常不需要设置组件的最小尺寸。但如果我们需要 这样做,我们有wminwmax限制。这应该由 布局管理器,而不是它之外的代码。设置(最小|最大|首选)大小 方法应该避免。 (然而,对于较差的管理者,人们离不开它们。) 同样,以像素为单位设置尺寸并非最佳。

现在我们开始解决这个问题。 MigLayouthidemode约束来处理 满足您的要求。有四种隐藏模式。我认为我们需要 hidemode 3,其中所有不可见的组件都不参与 布局。

package com.zetcode;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;


public class HidingComponentsEx extends JFrame {

    private ArrayList<JLabel> lbls;
    private int itemVisible = 0;

    public HidingComponentsEx() {

        initUI();
    }

    private void initUI() {

        createLabels();

        JButton prevBtn = new JButton("Previous");
        prevBtn.addActionListener(new PrevAction()); 

        JButton nextBtn = new JButton("Next");
        nextBtn.addActionListener(new NextAction());        

        JPanel pnl = new JPanel(new MigLayout("ins dialog"));

        pnl.add(prevBtn, "split 2, center");
        pnl.add(nextBtn, "wrap");

        for (JLabel lbl : lbls) {
            pnl.add(lbl, "cell 0 1, w 250lp, h 100lp, hidemode 3");
        }

        add(pnl);
        pack();

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

    private void createLabels() {

        lbls = new ArrayList<>();
        lbls.add(createLabel("North Sea"));
        lbls.add(createLabel("Ionian Sea"));
        lbls.add(createLabel("Norwegian Sea"));
        lbls.add(createLabel("Bering Sea"));
        lbls.add(createLabel("Dead Sea"));  
        lbls.get(itemVisible).setVisible(true);
    }

    private class NextAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent e) {

            lbls.get(itemVisible).setVisible(false);
            itemVisible++;

            if (itemVisible > 4) {
                itemVisible = 0;
            }

            lbls.get(itemVisible).setVisible(true);
        }
    }

    private class PrevAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent e) {

            lbls.get(itemVisible).setVisible(false);
            itemVisible--;

            if (itemVisible < 0) {
                itemVisible = 4;
            }

            lbls.get(itemVisible).setVisible(true);
        }
    }    

    private JLabel createLabel(String text) {

        JLabel lbl = new JLabel(text, JLabel.CENTER);
        lbl.setVisible(false);
        lbl.setBorder(BorderFactory.createEtchedBorder());

        return lbl;
    }


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                HidingComponentsEx ex = new HidingComponentsEx();
                ex.setVisible(true);
            }
        });       
    }
}

我们的示例有两个按钮和五个标签。按钮动态改变他们的 可视性。

MigLayout example