Java:通过复选框控制两个滚动条同步失效问题求助
问题分析与解决方案
你遇到的问题根源在于else块里新建的JScrollPane实例并没有替换界面上已经存在的scroller和scroller2组件。原来的scroller2仍然绑定着scroller的滚动模型,所以取消勾选后滚动同步依然存在,看起来代码无效。
修复思路
不要通过重新创建JScrollPane来恢复独立滚动,而是提前保存scroller2原本的水平滚动条模型,取消勾选时直接把这个原始模型设置回去即可。
具体代码修改步骤
- 在你的类中添加一个成员变量,用于保存scroller2的原始水平滚动条模型:
// 类成员变量,保存scroller2原本的滚动条模型 private BoundedRangeModel originalScroller2HorizontalModel;
- 在初始化scroller2的代码之后,立即保存它的原始模型(确保这一步在添加scroller2到界面之前完成):
// 初始化scroller2的原有代码 scroller2 = new JScrollPane(plotPanel2); // 保存原始滚动条模型 originalScroller2HorizontalModel = scroller2.getHorizontalScrollBar().getModel(); // 之后将scroller2添加到界面容器中 // container.add(scroller2);
- 修改ActionListener中的逻辑,去掉新建JScrollPane的代码,替换为恢复原始模型:
JCheckBox check = new JCheckBox("Global"); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { AbstractButton abstractButton = (AbstractButton) actionEvent.getSource(); boolean selected = abstractButton.getModel().isSelected(); System.out.println(selected); if (selected){ scroller2.getHorizontalScrollBar().setModel(scroller.getHorizontalScrollBar().getModel()); } else { // 恢复scroller2原本的滚动条模型,实现独立滚动 scroller2.getHorizontalScrollBar().setModel(originalScroller2HorizontalModel); } } }; check.addActionListener(actionListener);
为什么这样有效?
- 我们直接操作了界面上已存在的scroller2组件的滚动模型,而不是创建新的未添加到界面的JScrollPane实例。
- 保存原始模型的操作确保了取消勾选时能完全恢复到初始的独立滚动状态。
内容的提问来源于stack exchange,提问作者saucewagon
相关产品推荐
相关产品推荐

