MigLayout:基于反向适配的SizeGroup需求——实现文本框宽度等于另一文本框与按钮宽度之和
我明白你想要的效果——让aTextField的宽度恰好等于bTextField与bButton的宽度之和,而不是MigLayout sizegroup默认的“把较短元素拉伸到最长元素宽度”的行为。其实咱们只需要调整sizegroup的作用对象,就能轻松实现这个需求。
问题根源分析
你之前的代码里,把aTextField和bTextField单独加入了同一个sizegroup,这会强制它们的宽度一致,显然不符合你要的“aTextField是两者之和”的目标。MigLayout的sizegroup是作用于布局单元的,所以我们需要把bTextField和bButton的组合作为一个单元,再和aTextField绑定到同一个sizegroup里。
修改后的代码实现
import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; public class SizeGroupExample extends JFrame { private final MigLayout migLayout = new MigLayout("debug", "", ""); private final JLabel aLabel = new JLabel("Label A"); private final JTextField aTextField = new JTextField(); private final JLabel bLabel = new JLabel("Label B"); private final JTextField bTextField = new JTextField(); private final JButton bButton = new JButton("Press"); public SizeGroupExample() { Container container = getContentPane(); container.setLayout(migLayout); // 将aTextField加入sizegroup,宽度会跟随组内单元自动调整 add(aLabel, ""); add(aTextField, "sg textGroup, wrap"); add(bLabel, ""); // 用split 2把bTextField和bButton打包成一个布局单元,再加入同一个sizegroup add(bTextField, "split 2, sg textGroup"); add(bButton, "wrap"); setResizable(true); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { new SizeGroupExample(); } }
关键调整说明
- 给
aTextField和split单元(也就是bTextField+bButton的组合)设置同一个sizegroup(这里命名为textGroup),这样MigLayout会让aTextField的宽度匹配整个split单元的总宽度,正好满足aTextField.width = bTextField.width + bButton.width的需求。 - 如果你需要固定初始宽度,可以给
bTextField加上宽度约束,比如add(bTextField, "split 2, sg textGroup, w 200"),这样aTextField的初始宽度就会是200像素加上按钮的宽度。 - 保留
debug模式可以方便你查看布局单元的边界,随时确认效果是否符合预期。
内容的提问来源于stack exchange,提问作者BabaNew
相关产品推荐
相关产品推荐

