Java 在JScrollPane中更改JScrollBars值的问题:90是一个神奇的数字

Java 在JScrollPane中更改JScrollBars值的问题:90是一个神奇的数字,java,swing,user-interface,jscrollpane,jscrollbar,Java,Swing,User Interface,Jscrollpane,Jscrollbar,好的,我的基本前提是我有以下设置(): 我的问题只与主图像窗口有关。所有的小黑匣子围绕着由Harris Detector挑选出来的POI,我希望用户选择一个方块的子集作为训练集的基础发送。如图所示(右下角),我可以在单击框时将其变为红色,我可以通过在图像上重新绘制,然后将JSplit窗格的顶部组件更改为一个新的JScrollPane,它是一个封装图像图标的JLabel 这很好用,但是作为一个新的滚动窗格,它会跳回左上角,这是很不方便的。所以现在,在更改JScrollPane之前,我将存储水平和

好的,我的基本前提是我有以下设置():

我的问题只与主图像窗口有关。所有的小黑匣子围绕着由Harris Detector挑选出来的POI,我希望用户选择一个方块的子集作为训练集的基础发送。如图所示(右下角),我可以在单击框时将其变为红色,我可以通过在图像上重新绘制,然后将JSplit窗格的顶部组件更改为一个新的JScrollPane,它是一个封装图像图标的JLabel

这很好用,但是作为一个新的滚动窗格,它会跳回左上角,这是很不方便的。所以现在,在更改JScrollPane之前,我将存储水平和垂直条的当前值,然后将新的滚动条设置为相应的值

但是,这只对其中一个有效。真奇怪。第一个总是很好,第二个默认为90,不管它是如何设置的

相关代码段为:

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
相反的行为,但90仍然会被分配到第二条


欢迎提出任何建议。:)

保存视口的位置,而不是保存滚动条的各个值:

Point saved = scrollPane.getViewport().getViewPosition();
然后,您可以使用以下方法恢复位置:

scrollPane.getViewport().setViewPosition( saved );

另外,在更新GUI时,请确保所有代码都在事件调度线程上执行。

要更快获得更好的帮助,请发布一个(最简单的完整和可验证的示例)。顺便说一句——众所周知,如果任何数字包含魔法,它就是42