Java - 通过复选框同步两个滚动条
Java - synchronizing two scrollbars via a checkbox
下面的代码创建了一个复选框,我想在我的两个面板上启用同步滚动 on/off。最初,当程序运行时,滚动条是独立的。当复选框被选中并且到达 "if" 语句时,scroller2 的滚动条被设置为 scroller1 的滚动条的模型并且它们是连接的,即它们一起移动。
然而,当复选框未选中时出现问题,这意味着我希望滚动条再次独立。我放在 else 语句中的任何内容似乎都不起作用。
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 {
scroller = new JScrollPane(plotPanel);
scroller2 = new JScrollPane(plotPanel2);
}
}
};
check.addActionListener(actionListener);
这个:
scroller = new JScrollPane(plotPanel);
scroller2 = new JScrollPane(plotPanel2);
创建了两个新的 JScrollPanes,但您不对它们执行任何操作。明白改变a变量所指的对象,这里scroller和scroller2变量对显示的对象没有影响,这个问题就到了a的区别的核心区别参考 变量 和一个 参考 或对象。如果您想更改显示的 JScrollPane,您必须删除旧的,然后将新的添加到 GUI。
但是你不想这样做。只需为其中一个水平 JScrollBar 提供一个新模型,特别是一个新的 DefaultBoundedRangeModel。我会使用带 4 个整数的构造函数,并从当前模型中删除值、范围、最小值、最大值参数。
例如:
else {
JScrollBar horizBar = scroller2.getHorizontalScrollBar();
DefaultBoundedRangeModel currentModel = (DefaultBoundedRangeModel) horizBar.getModel();
int extent = currentModel.getExtent();
int min = currentModel.getMin();
int max = currentModel.getMax();
int value = currentModel.getValue();
DefaultBoundedRangeModel newModel = new DefaultBoundedRangeModel(value, extent, min, max);
horizBar.setModel(newModel);
}
注意代码未测试
下面的代码创建了一个复选框,我想在我的两个面板上启用同步滚动 on/off。最初,当程序运行时,滚动条是独立的。当复选框被选中并且到达 "if" 语句时,scroller2 的滚动条被设置为 scroller1 的滚动条的模型并且它们是连接的,即它们一起移动。
然而,当复选框未选中时出现问题,这意味着我希望滚动条再次独立。我放在 else 语句中的任何内容似乎都不起作用。
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 {
scroller = new JScrollPane(plotPanel);
scroller2 = new JScrollPane(plotPanel2);
}
}
};
check.addActionListener(actionListener);
这个:
scroller = new JScrollPane(plotPanel);
scroller2 = new JScrollPane(plotPanel2);
创建了两个新的 JScrollPanes,但您不对它们执行任何操作。明白改变a变量所指的对象,这里scroller和scroller2变量对显示的对象没有影响,这个问题就到了a的区别的核心区别参考 变量 和一个 参考 或对象。如果您想更改显示的 JScrollPane,您必须删除旧的,然后将新的添加到 GUI。
但是你不想这样做。只需为其中一个水平 JScrollBar 提供一个新模型,特别是一个新的 DefaultBoundedRangeModel。我会使用带 4 个整数的构造函数,并从当前模型中删除值、范围、最小值、最大值参数。
例如:
else {
JScrollBar horizBar = scroller2.getHorizontalScrollBar();
DefaultBoundedRangeModel currentModel = (DefaultBoundedRangeModel) horizBar.getModel();
int extent = currentModel.getExtent();
int min = currentModel.getMin();
int max = currentModel.getMax();
int value = currentModel.getValue();
DefaultBoundedRangeModel newModel = new DefaultBoundedRangeModel(value, extent, min, max);
horizBar.setModel(newModel);
}
注意代码未测试