我正在尝试用网格设计一类无限坐标板。我已经扩展了JViewport
并且它在初始位置绘制正确(在JScrollPane
内)。如何告诉滚动窗格有任何空间可以向任何方向滚动?
以下内容无效
JCoordinateViewport coordinate = new JCoordinateViewport();
coordinate.setBackground(Color.WHITE);
//coordinate.setPreferredSize(new Dimension(10000, 10000));
JScrollPane scroll = new JScrollPane();
//scroll.setViewportView(coordinate);
scroll.setViewport(coordinate);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.getVerticalScrollBar().setMinimum(-10000);
scroll.getVerticalScrollBar().setMaximum(+10000);
scroll.getHorizontalScrollBar().setMinimum(-10000);
scroll.getHorizontalScrollBar().setMaximum(+10000);
更新
有人知道JScrollPane如何从它的视口确定滚动范围吗?
UPDATE2
我发现,如果在调用setVisible
之后设置了最大值和最小值,则滚动条似乎有效。
但不幸的是,paintConponent
没有调用滚动。
为什么?
UPDATE3
尽管滚动条有效,但它们不会改变视口位置。
为什么?
答案 0 :(得分:2)
CoordinateViewport coordinate = new JCoordinateViewport(); coordinate.setBackground(Color.WHITE); //coordinate.setPreferredSize(new Dimension(10000, 10000));
JScrollPane scroll = new JScrollPane(); //scroll.setViewportView(coordinate);
scroll.setViewport(coordinate);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.getVerticalScrollBar().setMinimum(-10000);
scroll.getVerticalScrollBar().setMaximum(+10000);
scroll.getHorizontalScrollBar().setMinimum(-10000);
scroll.getHorizontalScrollBar().setMaximum(+10000);
以下内容无效
然后问题应该只在名为CoordinateViewport
更快地发布SSCCE,简短,可运行,可编辑,仅约JFrame
,JScrollPane
和JViewport
需要JViewport
来减少闪烁才能设置
拥有RepaintManager
并在JViewport
JViewport.setScrollMode(JViewport.BLIT_SCROLL_MODE); JViewport.setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE); JViewport.setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
请参阅Passing current Date和JTable how to change BackGround Color作为SSCCE的潜在来源
答案 1 :(得分:2)
如图here所示,在JViewport
上绘画似乎“粘住”到视口,而在底层可滚动组件上绘画则在下方滑动。大小是TILE
的整数倍:出于演示目的,视口的首选大小小于底层面板;在实践中,最好覆盖getPreferredSize()
。另请参阅ScrollAction
,当鼠标悬停在任何边界附近时会自动滚动。