摘要: 我想让一个组件跨越两行,尽管只有一行可用。下面的屏幕截图将说明我的问题。如果您愿意,您会在最后找到 SSCCE 来进行测试。
我已经提出了解决方法,但我想知道是否有更好的解决方案。
<小时/>案例1
由于添加了足够的元素,因此创建了两行:
相关代码:
JPanel panel = new JPanel(new MigLayout("wrap 7, debug, fill", "grow, fill", "grow, fill"));
int n = 8;
for(int i=0; i<n; i++) {
JPanel p = new JPanel();
p.setBackground(new Color(rand.nextInt()));
if(i == 2) {
panel.add(p, "spany 2");
}
else {
panel.add(p, "");
}
}
因此,当添加第 8 个面板时,MigLayout 会自动将其换行,并且有两行。现在第三个面板可以跨越两行。
案例2
只有一行:
相关代码更改:
int n = 7;
因此该行填充了 7 个面板,但 MigLayout 不会换行到新行,因此第三个面板无法跨越两行。
案例3
这是我的解决方法:
相关代码更改:
JPanel panel = new JPanel(new MigLayout("wrap 7, debug, fill", "grow, fill", "[grow, fill][grow, fill]"));
所以我告诉 MigLayout 有两行,所以第三个元素可以跨越两行。问题是我不知道会有多少行(或者说计算起来不方便)
还有其他可能实现这一目标吗?我的目标是将单个面板动态放大到其双倍高度。
<小时/>SSCCE:
public class MigPositionTest {
public static void main(String[] args) {
new MigPositionTest(); //Yes it is not started within EventDispatcher
}
private Random rand = new Random(123);
public MigPositionTest() {
JFrame frame = new JFrame();
frame.setTitle("MigLayout Span Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
JPanel panel = new JPanel(new MigLayout("wrap 7, debug, fill", "grow, fill", "grow, fill"));
int n = 8;
for(int i=0; i<n; i++) {
JPanel p = new JPanel();
p.setBackground(new Color(rand.nextInt()));
if(i == 2) {
panel.add(p, "spany 2");
}
else {
panel.add(p, "");
}
}
frame.setContentPane(panel);
frame.setVisible(true);
}
}
最佳答案
span
不会为我们创建新的列或行。必须有
其他列或行中的其他组件。 FormLayout
的工作原理
相同的。
我提出了两种可能的解决方案。
解决方案1
我们可以使用w
约束来设置面板的首选大小。
较高的面板尺寸加倍:
package com.zetcode;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
public class MigPanels extends JFrame {
public MigPanels() {
initUI();
setTitle("Spanning");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
JPanel pnl = new JPanel(new MigLayout("wrap 5"));
pnl.add(createPanel(), "w 50, h 150, top");
pnl.add(createPanel(), "w 50, h 150, top");
pnl.add(createPanel(), "w 50, h 300");
pnl.add(createPanel(), "w 50, h 150, top");
pnl.add(createPanel(), "w 50, h 150, top");
add(pnl);
pack();
}
private JPanel createPanel() {
JPanel pnl = new JPanel();
pnl.setBorder(BorderFactory.createEtchedBorder());
return pnl;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MigPanels ex = new MigPanels();
ex.setVisible(true);
}
});
}
}
解决方案2
我们在第二行放置一个虚拟标签:
package com.zetcode;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
public class MigPanels2 extends JFrame {
public MigPanels2() {
initUI();
setTitle("Spanning");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
JPanel pnl = new JPanel(new MigLayout("wrap 5"));
pnl.add(createPanel());
pnl.add(createPanel());
pnl.add(createPanel(), "growy, spany 2");
pnl.add(createPanel());
pnl.add(createPanel());
// dummy label
pnl.add(new JLabel(""), "cell 0 1, w 50, h 150");
add(pnl);
pack();
}
private JPanel createPanel() {
JPanel pnl = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 150);
}
};
pnl.setBorder(BorderFactory.createEtchedBorder());
return pnl;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MigPanels2 ex = new MigPanels2();
ex.setVisible(true);
}
});
}
}
关于java - Spany 2 与 MigLayout 一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983349/