问题在滚动条出现后发生了,当拖动滚动条的时候,线会出现重影错乱,网上搜索了很多资料还是无法解决。故而敬请诸位老师同学给予指点,不胜感激。部分代码如下:
....
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
http://img.my.csdn.net/uploads/201207/04/1341407652_1028.png
#2
自己顶一下。请大家给点建议。
#3
g.dispose();
this.revalidate();这两句不必要。
不应该在paintComponent中setPreferredSize。
应该先计算再setPreferredSize,然后再调用repaint()。而在paintComponent中,再次执行计算位置并绘制。
this.revalidate();这两句不必要。
不应该在paintComponent中setPreferredSize。
应该先计算再setPreferredSize,然后再调用repaint()。而在paintComponent中,再次执行计算位置并绘制。
#4
感谢楼上指教。
我重新修改了一下,把setPreferredSize 放到了paintComponent外面,不过问题仍然存在。
我修改后代码结构大概如下:
我想在Panel上画一个类似棋盘的坐标系,不过一个有趣的现象是,当我把滚动条从右向左滑动时,显示一切正常,但是从左向右时,就出现了重影混乱现象。
这个是JAVA的BUG吗? 我的系统是Debian JRE用的是SUN的1.7
无论如何,感谢楼上的建议。
我重新修改了一下,把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
问题解决了。我添加了以下代码:
就是在滚动条改变的时候重画一下。我觉得JScrollPane是自动重画的,不过也许是因为BUG,重画出现了问题。滚动条从左向右滑动就会出现图像混乱,不过从右向左滑动却显示正常。
所以我手动添加了一个监听器监听滚动条的变化。
虽然能解决我的问题,不过我认为这个不是一个正规的方法。一定是哪里出现了偏差。所以我暂时不想结贴,如果各位老师同学有更好的方法还请不吝赐教!
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);
... }
};
protected void paint(Graphics g) {
super.paint(g);
... }
};
#7
谢谢。楼主共享。
#1
抱歉,图片如下
http://img.my.csdn.net/uploads/201207/04/1341407652_1028.png
http://img.my.csdn.net/uploads/201207/04/1341407652_1028.png
#2
自己顶一下。请大家给点建议。
#3
g.dispose();
this.revalidate();这两句不必要。
不应该在paintComponent中setPreferredSize。
应该先计算再setPreferredSize,然后再调用repaint()。而在paintComponent中,再次执行计算位置并绘制。
this.revalidate();这两句不必要。
不应该在paintComponent中setPreferredSize。
应该先计算再setPreferredSize,然后再调用repaint()。而在paintComponent中,再次执行计算位置并绘制。
#4
感谢楼上指教。
我重新修改了一下,把setPreferredSize 放到了paintComponent外面,不过问题仍然存在。
我修改后代码结构大概如下:
我想在Panel上画一个类似棋盘的坐标系,不过一个有趣的现象是,当我把滚动条从右向左滑动时,显示一切正常,但是从左向右时,就出现了重影混乱现象。
这个是JAVA的BUG吗? 我的系统是Debian JRE用的是SUN的1.7
无论如何,感谢楼上的建议。
我重新修改了一下,把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
问题解决了。我添加了以下代码:
就是在滚动条改变的时候重画一下。我觉得JScrollPane是自动重画的,不过也许是因为BUG,重画出现了问题。滚动条从左向右滑动就会出现图像混乱,不过从右向左滑动却显示正常。
所以我手动添加了一个监听器监听滚动条的变化。
虽然能解决我的问题,不过我认为这个不是一个正规的方法。一定是哪里出现了偏差。所以我暂时不想结贴,如果各位老师同学有更好的方法还请不吝赐教!
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);
... }
};
protected void paint(Graphics g) {
super.paint(g);
... }
};
#7
谢谢。楼主共享。