求助。JAVA SWING 绘图滚动条重影问题

时间:2021-11-27 10:51:24
我在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));
}

运行时截图如下:
[img=http://img.my.csdn.net/uploads/201207/04/1341407652_1028.pnghttp://][/img]
应该是一条一条的竖线来着,不过一拖动滚动条就出现这个问题。
再次感谢大家帮助。

7 个解决方案

#1


抱歉,图片如下
http://img.my.csdn.net/uploads/201207/04/1341407652_1028.png
求助。JAVA SWING 绘图滚动条重影问题

#2


自己顶一下。请大家给点建议。

#3


g.dispose();
this.revalidate();这两句不必要。

不应该在paintComponent中setPreferredSize。
应该先计算再setPreferredSize,然后再调用repaint()。而在paintComponent中,再次执行计算位置并绘制。

#4


感谢楼上指教。
我重新修改了一下,把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

无论如何,感谢楼上的建议。

#5


问题解决了。我添加了以下代码:

        JScrollBar bar = scrollPane_1.getHorizontalScrollBar();
        bar.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
panel_LineChart.repaint();
}
        }); 

就是在滚动条改变的时候重画一下。我觉得JScrollPane是自动重画的,不过也许是因为BUG,重画出现了问题。滚动条从左向右滑动就会出现图像混乱,不过从右向左滑动却显示正常。
所以我手动添加了一个监听器监听滚动条的变化。
虽然能解决我的问题,不过我认为这个不是一个正规的方法。一定是哪里出现了偏差。所以我暂时不想结贴,如果各位老师同学有更好的方法还请不吝赐教!

#6


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

#7


引用 5 楼  的回复:
问题解决了。我添加了以下代码:
Java code

        JScrollBar bar = scrollPane_1.getHorizontalScrollBar();
        bar.addAdjustmentListener(new AdjustmentListener() {
            public void adjustmentValueChange……

谢谢。楼主共享。

#1


抱歉,图片如下
http://img.my.csdn.net/uploads/201207/04/1341407652_1028.png
求助。JAVA SWING 绘图滚动条重影问题

#2


自己顶一下。请大家给点建议。

#3


g.dispose();
this.revalidate();这两句不必要。

不应该在paintComponent中setPreferredSize。
应该先计算再setPreferredSize,然后再调用repaint()。而在paintComponent中,再次执行计算位置并绘制。

#4


感谢楼上指教。
我重新修改了一下,把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

无论如何,感谢楼上的建议。

#5


问题解决了。我添加了以下代码:

        JScrollBar bar = scrollPane_1.getHorizontalScrollBar();
        bar.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
panel_LineChart.repaint();
}
        }); 

就是在滚动条改变的时候重画一下。我觉得JScrollPane是自动重画的,不过也许是因为BUG,重画出现了问题。滚动条从左向右滑动就会出现图像混乱,不过从右向左滑动却显示正常。
所以我手动添加了一个监听器监听滚动条的变化。
虽然能解决我的问题,不过我认为这个不是一个正规的方法。一定是哪里出现了偏差。所以我暂时不想结贴,如果各位老师同学有更好的方法还请不吝赐教!

#6


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

#7


引用 5 楼  的回复:
问题解决了。我添加了以下代码:
Java code

        JScrollBar bar = scrollPane_1.getHorizontalScrollBar();
        bar.addAdjustmentListener(new AdjustmentListener() {
            public void adjustmentValueChange……

谢谢。楼主共享。