我的问题与一个带有内部JScrollPane
的{{1}}有关。我尝试在JPanel
上绘画,但是它会短暂出现,然后消失,直到我手动移动JPanel
,然后再次出现并保持稳定。为避免手动干预(或在实际代码中难以管理的HorizontalScrollBar
),我在HorizontalScrollBar.setValue
,validate/revalidate
上尝试了JPanel
(及更多), Viewport
和JScrollPane
。
下面的(非常)简化的代码重现了该问题。可能很明显,但我看不到。
JFrame
答案 0 :(得分:1)
代码有些错误,这里是固定代码。有关说明,请参见代码下面的要点。
public class RenderZone extends JPanel {
private static final long serialVersionUID = -8240875812801921009L;
private BufferedImage image = null;
private BufferedImage sub = null;
public RenderZone() {
this.setBackground(Color.WHITE);
this.setPreferredSize(new Dimension(1124, 768));// added 100 for test purpose
image = new BufferedImage(2000, 1000, BufferedImage.TYPE_INT_RGB);
sub = image.getSubimage(0, 0, 1024, 768);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);// pour repeindre la panel à chaque fois
if (sub != null) {
g.drawImage(sub, 0, 0, this);
}
}
}
好..
Graphics2D g2 = (Graphics2D)this.getGraphics();
当您已经有一个有效的Graphics
实例时,很难确定为什么认为这是一个好主意。但基本上,请使用提供的Graphics
实例。ImageIO.read(..);
读图像不是不是,任何绘画方法都应该这样做。应该将它一次加载到类的构造函数中。sub = image.getSubimage(0, 0, 1024, 768);
同样,并不是每次调用画图时您都想做的事情,实际上,最好在照片编辑软件中以合适的尺寸创建图像,然后加载裁剪后的图片。} catch (IOException e) {}
不要忽略异常!他们确切地告诉我们出了什么问题。除非实施了日志记录,否则至少调用Throwable.printStackTrace()
if( sub!=null)g2.drawImage(sub, 0, 0, null);
由于每个JComponent
都是 ImageObserver
,因此应该为if( sub!=null)g2.drawImage(sub, 0, 0, this);
还有一些可疑但不是眼前问题的东西,所以它们没有改变:
// pour repeindre la panel à chaque fois
用..法语编写该代码注释(仅供人类食用)的目的是什么?请用英语输入针对此站点的代码注释。否则它们就是噪音。this.setPreferredSize(new Dimension(1124, 768));
最好是重写getPreferredSize()
并根据sub
图片的大小(如直接从中获取的数字)返回一个值。mainPane.setPreferredSize(new Dimension(1024, 768));
比mainPane.pack();
更好。后者不是猜测,将说明子组件的首选大小。