我在JScrollPane 里面加入了JPanel,然后在JPanel上画线。当线的长度超过显示面积的时候,通过重设preferredsize和revalidate()显示滚动条。
问题在滚动条出现后发生了,当拖动滚动条的时候,线会出现重影错乱,网上搜索了很多资料还是无法解决。故而敬请诸位老师同学给予指点,不胜感激。部分代码如下:....
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setAutoscrolls(true);
scrollPane_1.setDoubleBuffered(true);
final JPanel panel_LineChart = new JPanel() {
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    drawOverviewLineChart((Graphics2D)g, this);
    g.dispose();
    this.revalidate();
   }
};
panel_LineChart.setAutoscrolls(true);
panel_LineChart.setBackground(new Color(255, 250, 240));
scrollPane_1.setViewportView(panel_LineChart);
.....
private void drawOverviewLineChart(Graphics2D g, JPanel panel) {
     Stroke stroke;
        int startX = 50;
        int startY = 50;
        int gridWidth = 30;
        int gridHeight = (panel.getHeight()-100)/10;
        int width = startX + gridWidth*sp.getDayNum() + 20;
        
        System.out.println("Line" + panel.getHeight());        
        stroke = g.getStroke();
        g.setColor(Color.LIGHT_GRAY);
        g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{1, 1}, 0));   
     
        for (int i=0; i<sp.getDayNum(); i++) {
         g.drawLine(startX + i*gridWidth, startY, startX+i*gridWidth, startY+gridHeight*10);
        }
 
        g.setStroke(stroke);
        panel.setPreferredSize(new Dimension(width, 0));
}运行时截图如下:应该是一条一条的竖线来着,不过一拖动滚动条就出现这个问题。
再次感谢大家帮助。

解决方案 »

  1.   

    抱歉,图片如下
    http://img.my.csdn.net/uploads/201207/04/1341407652_1028.png
      

  2.   

    g.dispose();
    this.revalidate();这两句不必要。不应该在paintComponent中setPreferredSize。
    应该先计算再setPreferredSize,然后再调用repaint()。而在paintComponent中,再次执行计算位置并绘制。
      

  3.   

    感谢楼上指教。
    我重新修改了一下,把setPreferredSize 放到了paintComponent外面,不过问题仍然存在。
    我修改后代码结构大概如下:final JPanel panel_LineChart = new JPanel() {
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawOverviewLineChart((Graphics2D)g, this);
        g.dispose();
      }
    };
    panel_LineChart.setBackground(new Color(255, 250, 240));
    scrollPane_1.setViewportView(panel_LineChart);
    panel_LineChart.setLayout(null);
    int width = 50 + 30*sp.getDayNum() + 20;
    panel_LineChart.setPreferredSize(new Dimension(width, 0));
    panel_LineChart.repaint();private void drawOverviewLineChart(Graphics2D g, JPanel panel) {
         Stroke stroke;
            int startX = 50;
            int startY = 50;
            int gridWidth = 30;
            int gridHeight = (panel.getHeight()-100)/10;
            int width = startX + gridWidth*sp.getDayNum() + 20;
           
            stroke = g.getStroke();
            g.setColor(Color.LIGHT_GRAY);
            g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{1, 1}, 0));   
               
            for (int i=0; i<sp.getDayNum(); i++) {
             g.drawLine(startX + i*gridWidth, startY, startX+i*gridWidth, startY+gridHeight*10);
            }  
            for (int i=0; i<11; i++) {
             g.drawLine(startX, startY + i*gridHeight, width-startX, startY + i*gridHeight);
            }
      
            g.setStroke(stroke);
    }我想在Panel上画一个类似棋盘的坐标系,不过一个有趣的现象是,当我把滚动条从右向左滑动时,显示一切正常,但是从左向右时,就出现了重影混乱现象。
    这个是JAVA的BUG吗? 我的系统是Debian JRE用的是SUN的1.7无论如何,感谢楼上的建议。
      

  4.   

    问题解决了。我添加了以下代码:        JScrollBar bar = scrollPane_1.getHorizontalScrollBar();
            bar.addAdjustmentListener(new AdjustmentListener() {
    public void adjustmentValueChanged(AdjustmentEvent e) {
    panel_LineChart.repaint();
    }
            }); 就是在滚动条改变的时候重画一下。我觉得JScrollPane是自动重画的,不过也许是因为BUG,重画出现了问题。滚动条从左向右滑动就会出现图像混乱,不过从右向左滑动却显示正常。
    所以我手动添加了一个监听器监听滚动条的变化。
    虽然能解决我的问题,不过我认为这个不是一个正规的方法。一定是哪里出现了偏差。所以我暂时不想结贴,如果各位老师同学有更好的方法还请不吝赐教!
      

  5.   

    final JPanel panel_LineChart = new JPanel() {
      protected void paint(Graphics g) {
        super.paint(g);
       ...   }
    };