我有一个JPanel,我想添加我在飞行中生成的JPEG和PNG图像。
到目前为止,我在Swing教程中看到的所有示例,特别是在Swing示例中,都使用了ImageIcons。
我将这些图像生成为字节数组,它们通常比示例中使用的普通图标大,为640x480。
在使用ImageIcon类在JPanel中显示这样大小的图像时,是否存在任何(性能或其他)问题?
通常的做法是什么?
如何添加一个图像到JPanel而不使用ImageIcon类?
编辑:对教程和API进行更仔细的检查可以发现,您不能将ImageIcon直接添加到JPanel中。相反,它们通过将图像设置为JLabel的图标来实现相同的效果。这感觉不对……
我在自己的一个私人项目中也在做类似的事情。到目前为止,我已经生成了高达1024x1024的图像,没有任何问题(除了内存),并且可以非常快速地显示它们,没有任何性能问题。
重写JPanel子类的paint方法是多余的,并且需要比您需要做的更多的工作。
我的做法是:
Class MapIcon implements Icon {...}
OR
Class MapIcon extends ImageIcon {...}
用于生成图像的代码将在该类中。我使用BufferedImage来绘制然后当paintIcon()被调用时,使用g.drawImvge(BufferedImage);这样可以减少生成图像时的闪烁次数,并且可以使用线程。
接下来我扩展JLabel:
Class MapLabel extends Scrollable, MouseMotionListener {...}
这是因为我想把我的图像放在滚动窗格上,即显示图像的一部分,并让用户根据需要滚动。
因此,我使用JScrollPane来保存只包含MapIcon的MapLabel。
MapIcon map = new MapIcon ();
MapLabel mapLabel = new MapLabel (map);
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport ().add (mapLabel);
但对于你的场景(每次只显示整个图像)。您需要将MapLabel添加到顶部JPanel,并确保将它们全部设置为图像的完整大小(通过覆盖GetPreferredSize())。
你可以子类化JPanel -这里是我的ImagePanel的一个提取,它把一个图像放在5个位置中的任何一个,上/左,上/右,中/中,下/左或下/右:
protected void paintComponent(Graphics gc) {
super.paintComponent(gc);
Dimension cs=getSize(); // component size
gc=gc.create();
gc.clipRect(insets.left,insets.top,(cs.width-insets.left-insets.right),(cs.height-insets.top-insets.bottom));
if(mmImage!=null) { gc.drawImage(mmImage,(((cs.width-mmSize.width)/2) +mmHrzShift),(((cs.height-mmSize.height)/2) +mmVrtShift),null); }
if(tlImage!=null) { gc.drawImage(tlImage,(insets.left +tlHrzShift),(insets.top +tlVrtShift),null); }
if(trImage!=null) { gc.drawImage(trImage,(cs.width-insets.right-trSize.width+trHrzShift),(insets.top +trVrtShift),null); }
if(blImage!=null) { gc.drawImage(blImage,(insets.left +blHrzShift),(cs.height-insets.bottom-blSize.height+blVrtShift),null); }
if(brImage!=null) { gc.drawImage(brImage,(cs.width-insets.right-brSize.width+brHrzShift),(cs.height-insets.bottom-brSize.height+brVrtShift),null); }
}