我正在尝试获得两个组件,
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和选项中突出显示的两个组件。 我的目标是让上面的按钮将“setVisible”设置为true,将另一个设置为false。他们永远都不会是真的。如何在一个单元格中同时获得两个组件?它也使我的上面的按钮不合适,我不太清楚为什么。我在上面提到了涉及这两个组件的重要代码,如果你请求,我可以把完整的GUI代码。
我发现了这个:Fill Entire Cell With Two Components Using MigLayout然而它已经过了几年了,说实话,我不明白这个解决方案。 我有点学习,我以前从未使用过MigLayout。我应该使用不同的布局吗?
感谢您的帮助
答案 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));
通常不需要设置组件的最小尺寸。但如果我们需要
这样做,我们有wmin
和wmax
限制。这应该由
布局管理器,而不是它之外的代码。设置(最小|最大|首选)大小
方法应该避免。 (然而,对于较差的管理者,人们离不开它们。)
同样,以像素为单位设置尺寸并非最佳。
现在我们开始解决这个问题。 MigLayout
有hidemode
约束来处理
满足您的要求。有四种隐藏模式。我认为我们需要
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);
}
});
}
}
我们的示例有两个按钮和五个标签。按钮动态改变他们的 可视性。