我有一个带有JPanel的JScrollPane,我可以通过鼠标和代码绘制。 我需要有可能放大我的绘图中的细节。 但很快我得到了一个outOfMemoryError。我想因为我在缩放时使绘图很大。 这是我的代码:
private BufferedImage _bufferedImage;
private int _panelWidth = 2000, _panelHeight = 1500;
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if(_bufferedImage != null){
g.drawImage(_bufferedImage, 0, 0, this);
}
}
public void draw(float zoomFactor){
try {
int width = (int)(_panelWidth * zoomFactor);
int height = (int)(_panelHeight * zoomFactor);
_bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = _bufferedImage.createGraphics();
g2.setBackground(Color.WHITE);
g2.setPaint(Color.BLACK);
g2.scale(zoomFactor, zoomFactor);
drawHouse(g2); ...
g2.dispose();
}
catch (Exception e) {
e.printStackTrace();
}
repaint();
}
我必须做更好的练习。
我可以绘制滚动窗格的区域,但是我不能使用滚动条, 然后我必须使用带有向上,向右,向左,向下箭头的按钮在我的绘图中滚动。 谁可以给我一个提示?
答案 0 :(得分:2)
但我不能使用滚动条
当组件的首选大小大于滚动窗格的大小时,滚动条会起作用。如果要在paintComponent()方法中缩放图像,则还需要覆盖getPreferredSize()
方法以返回考虑缩放系数的图像的适当大小。
因此,在您的情况下,首选尺寸将是图像的大小。
答案 1 :(得分:2)
如果你想放大,我假设你不是想制作“更大的像素”,而是以更高的比例绘制相同的数字。在这种情况下,你根本不应该使用BufferedImage
- 相反,你应该绘制一个适当缩放的JPanel
或类似的。无论何时需要,您都可以随时拍摄任何渲染的快照;但是在没有必要的情况下渲染到BufferedImage
是浪费(时间和记忆)。
有关详细信息,请参阅this answer。