【问题标题】:Two Components on top of each other using MigLayout使用 MigLayout 将两个组件放在一起
【发布时间】:2014-08-19 23:03:48
【问题描述】:

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

    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);

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

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

我发现了这个:Fill Entire Cell With Two Components Using MigLayout 但是它已经存在多年了,老实说,我不明白解决方案。 我边走边学,我以前从未使用过 MigLayout。我应该使用不同的布局吗?

感谢您的帮助

【问题讨论】:

  • 也可以考虑OverlayLayout,见here

标签: java swing user-interface miglayout


【解决方案1】:

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

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

List choices = new List();

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

【讨论】:

  • 只是出于兴趣,混合 AWT 和 Swing 有什么问题?这是不好的做法,还是可能会与更高级的应用程序混淆,因为我认为它们具有不同的方法/功能?
【解决方案2】:

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

不,坚持使用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);
            }
        });       
    }
}

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

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 2019-02-16
    • 1970-01-01
    • 2018-02-03
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多