【发布时间】:2015-12-21 11:58:38
【问题描述】:
我在 NetBeans 中的 GUI 有一点问题。当用户在鼠标单击位置的 JPanel 中单击时,我会绘制图像(点)。这部分工作得很好。我将每个图像位置存储在两个不同的 ArrayList 中,其中包含 X 位置和 Y 位置。现在我要做的是在单击按钮后删除面板中绘制的最新图像。所以我所做的是删除两个 ArrayList 的最后一个索引,然后调用 repaint() 从 X 和 Y ArrayList 中的位置绘制所有图像(代码如下)。
奇怪的是,我需要调整 GUI 的大小(将其全屏显示或只是更改其大小),以便绘制的图像再次显示在 JPanel 中,否则,面板仍然是空的。
以下是受影响的代码部分:
public void paint(Graphics g) {
super.paint(g);
for(int i=0;i<=listePointsX.size()-1;i++) {
try{
BufferedImage icon = ImageIO.read(getClass().getResourceAsStream("/myimage.png"));
Graphics graphe = jPanel1.getGraphics();
graphe.setColor(Color.BLACK);
graphe.drawImage(icon, this.listePointsX.get(i),this.listePointsY.get(i), rootPane);
}catch(Exception e1){
}
}
private void jButtonUndoActionPerformed(java.awt.event.ActionEvent evt) {
if(listePointsX.size()>0){
int lastObject= listePointsX.size();
listePointsX.remove(lastObject-1);
listePointsY.remove(lastObject-1);
jPanel1.repaint();
}
else{
}
}
知道我需要做什么来“刷新”整个事情吗?难道我做错了什么?尝试搜索但没有找到任何东西......
【问题讨论】:
-
天哪,您在绘画方法中多次重复读取图像文件,这种方法需要非常快。永远不要这样做一次,更不用说多次了。接下来,你不应该覆盖paint,而是应该覆盖paintComponent,你不应该有空的catch块,......这里有很多错误。请停下来,先阅读教程,因为你只是在猜测并且做出了很多错误的猜测。
-
是的,气垫船说的。将 ImageIO.read() 调用移到 for 循环之外,以便您只执行一次。
-
@Parappa:读取的图像不仅应该在循环之外,还应该在所有绘画方法之外。绘制方法的速度是 GUI 程序感知响应能力的主要决定因素,绝不应该像上面的代码那样被文件 I/O 减慢。
-
@Hovercraft :我知道 Catch 块是空的,我只是还没有这样做,但我肯定不会让它为空,哈哈。
-
对于 ImageIO.read(),就像你说的那样,它不会改变,所以我不会把它留在循环中......无论是在paint方法中,都只是一个静态的类变量。
标签: java swing paint paintcomponent undo