Java 使用MigLayout将两个组件置于彼此之上

Java 使用MigLayout将两个组件置于彼此之上,java,swing,user-interface,miglayout,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.setVi

我试图得到两个组件

    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和choices中突出显示的两个组件。 我的目标是让上面的按钮将一个“setVisible”设置为true,另一个设置为false。他们永远不会都是真的。如何在一个单元格中同时获得两个组件?它也把我上面的按钮放错了位置,我不太清楚为什么。我把这两个组件的重要代码放在上面,如果您要求,我可以把完整的GUI代码放在上面

我发现了这一点:不管它有多古老,老实说,我不明白解决办法。 我在不断学习,我以前从未使用过MigLayout。我应该使用不同的布局吗

谢谢你的帮助

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

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

List choices = new List();
在我看来,您正在使用AWT组件。您应该对Swing应用程序使用
JList

我应该使用不同的布局吗

否,请坚持使用MigLayout。您选择了正确的布局管理器。 我建议你花点时间学习这位经理;创造夫妇 在较小的实际示例中,了解此 经理提供

它也把我上面的按钮放错了位置,我不太清楚为什么

MigLayout
是一种基于网格的布局管理器。(其最重要的模式是。) 新按钮和打开按钮之间的间隙是由于 高亮显示的组件和新按钮构成一列。列宽 由最大单元格的宽度确定。要绕过这一点,我们可以 使用
split
约束。(通常与
span
约束结合使用。) 在我的示例中,我使用此技术将两个按钮居中放置在 当前可见的标签。 如果我们对布局中的某些内容不确定,可以使用
debug
绘制网格线和边界的布局约束 组件的名称

frame.getContentPane().setLayout(new MigLayout("", "[53px,grow][57px][grow]", "[23px][][][]"));
不要以像素为单位设置边界。你没有利用其中一个 该经理最重要的优势是独立于解决方案和 新闻部。像素边界不可移植。在较小的屏幕上,按钮之间的3倍间隙看起来可以,但在较大的屏幕上则不可接受。
MigLayout
提供了多个选项供选择,包括相关和不相关的间隙、逻辑像素、点或厘米

itemTitle.setMinimumSize(new Dimension(50, 50));
通常不需要设置零部件的最小尺寸。但如果我们需要 这样做,我们有
wmin
wmax
约束。这应该由政府来完成 布局管理器,而不是它之外的代码。集合(最小|最大|首选)大小 应该避免使用这种方法。(然而,对于较差的管理者,我们不能没有他们。) 同样,以像素为单位设置尺寸并不是最优的

现在我们来解决问题
MigLayout
具有
hidemode
交易约束 符合你的要求。有四种隐藏模式。我想我们需要
隐藏节点3
,其中所有不可见组件都不参与 布局

package com.zetcode;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.util.ArrayList;
导入javax.swing.AbstractAction;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入net.miginfocom.swing.MigLayout;
公共类隐藏组件扩展JFrame{
私人ArrayList lbls;
私有int itemVisible=0;
公共隐藏组件sex(){
initUI();
}
私有void initUI(){
createLabels();
JButton prevBtn=新JButton(“先前”);
addActionListener(新的PrevAction());
JButton nextBtn=新JButton(“下一步”);
addActionListener(新的NextAction());
JPanel pnl=新的JPanel(新的MIGALAYOUT(“ins对话框”);
pnl.add(上一页,“拆分2,中间”);
pnl.添加(下一个“包装”);
用于(JLabel-lbl:lbls){
pnl.add(lbl,“单元格0 1,w 250lp,h 100lp,隐藏模式3”);
}
添加(pnl);
包装();
setTitle(“布局示例”);
setLocationRelativeTo(空);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
私有void createLabels(){
lbls=新的ArrayList();
lbls.add(createLabel(“北海”));
添加(createLabel(“爱奥尼亚海”);
lbls.add(createLabel(“挪威海”));
添加(createLabel(“白令海”);
添加(createLabel(“死海”);
lbls.get(itemVisible).setVisible(true);
}
私有类NextAction扩展了AbstractAction{
@凌驾
已执行的公共无效操作(操作事件e){
lbls.get(itemVisible).setVisible(false);
itemVisible++;
如果(itemVisible>4){
itemVisible=0;
}
lbls.get(itemVisible).setVisible(true);
}
}
私有类PrevAction扩展了AbstractAction{
@凌驾
已执行的公共无效操作(操作事件e){
lbls.get(itemVisible).setVisible(false);
可见项--;
如果(项可见<0){
可见项=4;
}
lbls.get(itemVisible).setVisible(true);
}
}    
专用JLabel createLabel(字符串文本){
JLabel lbl=新的JLabel(文本,JLabel.CENTER);
lbl.setVisible(假);
lbl.setboorder(BorderFactory.createtchedborder());
雷图
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);
            }
        });       
    }
}