BorderLayout布局下JList遮挡中间边框及全量移动按钮功能异常问题
问题解决方案
问题1:JList遮挡BorderLayout中间区域
- 原因:空JList绑定的JScrollPane默认没有固定首选宽度,BorderLayout布局计算时会优先满足东西区域的尺寸需求,挤压中间CENTER区域的显示空间,视觉上看起来像被JList遮挡。
- 修复方案:给东西两侧的JScrollPane显式设置固定首选宽度,也可以给中间按钮面板加内边距避免和两侧列表紧贴:
// 导入需要的包 import java.awt.Dimension; import javax.swing.BorderFactory; // 原添加东西侧列表的代码修改为如下内容 JScrollPane leftScroll = new JScrollPane(list); leftScroll.setPreferredSize(new Dimension(150, 0)); // 宽度固定150,高度由BorderLayout自动拉伸 c.add(leftScroll,BorderLayout.WEST); JScrollPane rightScroll = new JScrollPane(list1); rightScroll.setPreferredSize(new Dimension(150, 0)); c.add(rightScroll,BorderLayout.EAST); // 给中间按钮面板加内边距,优化显示效果 jp1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
问题2:leftall和rightall按钮功能不符合预期
- 原因:原有逻辑在遍历列表Model的同时删除元素,会导致索引错位,部分元素无法被正确移动。例如列表有3个元素时,删除索引0的元素后,原索引1的元素会变为新的索引0,循环i自增到1时就会跳过该元素。
- 修复方案:先把原列表所有元素批量添加到目标列表,再直接清空原列表,避免索引错误:
// 修正>>按钮(全部移到右侧)逻辑 rightall.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { super.mouseClicked(e); // 先把左侧所有元素添加到右侧 for(int i=0; i<listmodel1.getSize();i++){ listmodel2.addElement(listmodel1.getElementAt(i)); } // 清空左侧列表 listmodel1.clear(); } }); // 修正<<按钮(全部移到左侧)逻辑 leftall.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { super.mouseClicked(e); // 先把右侧所有元素添加到左侧 for(int i=0; i<listmodel2.getSize();i++){ listmodel1.addElement(listmodel2.getElementAt(i)); } // 清空右侧列表 listmodel2.clear(); } });
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

