覆盖绘画(图形 g)Java

Override paint(graphics g) Java

我在 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{

    }


}   

知道我需要对某种 "refresh" 做些什么吗?难道我做错了什么?尝试搜索但没有找到任何东西......

Graphics graphe = jPanel1.getGraphics(); 不是绘画的工作方式,相反,您应该覆盖面板的 paintComponent 方法并在其中绘制点。

有关绘画在 Swing 中如何工作的更多详细信息,请参阅 Painting in AWT and Swing and Performing Custom Painting

相反,您的面板应该完成所有工作,管理 ArrayList 中的点并绘制它们。如果满足您的设计要求,您的父组件 "might" 可以添加或删除点,但核心责任仍由面板承担。

避免在 paint 方法中执行任何长 运行ning 或块操作,它们应该 运行 尽可能快。由于图像永远不会改变,您应该只加载一次(在构造 class 时或在您第一次需要图像时)并继续使用相同的引用。

好的,现在一切正常。我必须按照你在这里告诉我的方式去做。我创建了一个新的 class 来扩展 jPanel(如下)。然后在我的主窗体中,不得不创建一个这个 class 的对象。每当用户点击时,它都会调用此 Drawing class 对象并向 ArrayList 添加一个项目(此对象管理有关创建点的所有内容......它看起来像这样:

public class MyDrawingClass extends JPanel {
ArrayList<Integer> arrayListPointX = new ArrayList<>();
ArrayList<Integer> arrayListPointY = new ArrayList<>();

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    try{
    BufferedImage icon = ImageIO.read(getClass().getResourceAsStream("/images/dot.png"));
    g.setColor(Color.BLACK);
    if(arrayListPointX.size()<=0){
        ...
    }
    else{
        for(int i=0;i<listePointsX.size();i++){
                g.setColor(Color.BLACK);
                g.drawImage(icon, listePointsX.get(i), listePointsY.get(i), rootPane);
        }
    }
    }catch(Exception e){
        ...
    }
}

因此,如果我想 "undo",假设我的 "MyDrawingClass" 对象称为 "draw"。我能做到:draw.arrayListPointX.remove(draw.arrayListPointX.size()-1);并调用 repaint();显示剩余点数。

感谢您的提示,不胜感激! :)