如何正确扩展JViewport?

时间:2013-02-21 21:48:07

标签: java swing jscrollpane jviewport

我正在尝试用网格设计一类无限坐标板。我已经扩展了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

尽管滚动条有效,但它们不会改变视口位置。

为什么?

2 个答案:

答案 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,简短,可运行,可编辑,仅约JFrameJScrollPaneJViewport

  • 需要JViewport来减少闪烁才能设置

    1. 拥有RepaintManager

    2. 并在JViewport

    3. 中使用/ with built_in方法

      JViewport.setScrollMode(JViewport.BLIT_SCROLL_MODE); JViewport.setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE); JViewport.setScrollMode(JViewport.SIMPLE_SCROLL_MODE);

    4. 请参阅Passing current DateJTable how to change BackGround Color作为SSCCE的潜在来源

答案 1 :(得分:2)

如图here所示,在JViewport上绘画似乎“粘住”到视口,而在底层可滚动组件上绘画则在下方滑动。大小是TILE的整数倍:出于演示目的,视口的首选大小小于底层面板;在实践中,最好覆盖getPreferredSize()。另请参阅ScrollAction,当鼠标悬停在任何边界附近时会自动滚动。

image