Java 在JScrollPane中更改JScrollBars值的问题:90是一个神奇的数字
好的,我的基本前提是我有以下设置(): 我的问题只与主图像窗口有关。所有的小黑匣子围绕着由Harris Detector挑选出来的POI,我希望用户选择一个方块的子集作为训练集的基础发送。如图所示(右下角),我可以在单击框时将其变为红色,我可以通过在图像上重新绘制,然后将JSplit窗格的顶部组件更改为一个新的JScrollPane,它是一个封装图像图标的JLabel 这很好用,但是作为一个新的滚动窗格,它会跳回左上角,这是很不方便的。所以现在,在更改JScrollPane之前,我将存储水平和垂直条的当前值,然后将新的滚动条设置为相应的值 但是,这只对其中一个有效。真奇怪。第一个总是很好,第二个默认为90,不管它是如何设置的 相关代码段为:Java 在JScrollPane中更改JScrollBars值的问题:90是一个神奇的数字,java,swing,user-interface,jscrollpane,jscrollbar,Java,Swing,User Interface,Jscrollpane,Jscrollbar,好的,我的基本前提是我有以下设置(): 我的问题只与主图像窗口有关。所有的小黑匣子围绕着由Harris Detector挑选出来的POI,我希望用户选择一个方块的子集作为训练集的基础发送。如图所示(右下角),我可以在单击框时将其变为红色,我可以通过在图像上重新绘制,然后将JSplit窗格的顶部组件更改为一个新的JScrollPane,它是一个封装图像图标的JLabel 这很好用,但是作为一个新的滚动窗格,它会跳回左上角,这是很不方便的。所以现在,在更改JScrollPane之前,我将存储水平和
int scrollHoriz = view_scroll.getHorizontalScrollBar().getValue();
int scrollVerti = view_scroll.getVerticalScrollBar().getValue();
System.out.println("OLD Horizontal Position: " + view_scroll.getHorizontalScrollBar().getValue());
System.out.println("OLD Vertical Position: " + view_scroll.getVerticalScrollBar().getValue());
System.out.println("Horiz: " + scrollHoriz);
System.out.println("Verti: " + scrollVerti + "\n");
view_scroll = new JScrollPane();
view_scroll.getViewport().add(new JLabel(new ImageIcon(theImage)));
view_scroll.getHorizontalScrollBar().setUnitIncrement(12);
view_scroll.getVerticalScrollBar().setUnitIncrement(12);
view_scroll.getViewport().getView().addMouseListener(new TrainingMousePress(this));
view_scroll.getVerticalScrollBar().setValue(scrollVerti);
view_scroll.getHorizontalScrollBar().setValue(scrollHoriz);
System.out.println("NEW Horizontal Position: " + view_scroll.getHorizontalScrollBar().getValue());
System.out.println("NEW Vertical Position: " + view_scroll.getVerticalScrollBar().getValue());
System.out.println("Horiz: " + scrollHoriz);
System.out.println("Verti: " + scrollVerti);
view.remove(view.getTopComponent());
view.setTopComponent(view_scroll);
view.setDividerLocation(600);
return;
将打印出(单击任何框):
- 旧水平位置:216
- 旧垂直位置:360
- 霍里兹:216
- Verti:360
- 新水平位置:90
- 新垂直位置:360
- 霍里兹:216
- Verti:360
view_scroll.getHorizontalScrollBar().setValue(scrollHoriz);
view_scroll.getVerticalScrollBar().setValue(scrollVerti);
你会得到:
- 旧水平位置:569
- 旧垂直位置:510
- 霍里兹:569
- Verti:510
- 新水平位置:444
- 新垂直位置:90
- 霍里兹:444
- Verti:474
欢迎提出任何建议。:) 保存视口的位置,而不是保存滚动条的各个值:
Point saved = scrollPane.getViewport().getViewPosition();
然后,您可以使用以下方法恢复位置:
scrollPane.getViewport().setViewPosition( saved );
另外,在更新GUI时,请确保所有代码都在事件调度线程上执行。要更快获得更好的帮助,请发布一个(最简单的完整和可验证的示例)。顺便说一句——众所周知,如果任何数字包含魔法,它就是42