代码之家  ›  专栏  ›  技术社区  ›  FidelCasto

覆盖绘制(图形g)Java

  •  1
  • FidelCasto  · 技术社区  · 9 年前

    我在NetBeans中的GUI有点问题。当用户在JPanel中单击鼠标clic位置时,我会绘制图像(点)。这部分工作得很好。我将每个图像位置存储在两个不同的ArrayList中,其中包含X位置和Y位置。现在我要做的是在单击按钮后删除面板中绘制的最新图像。因此,我所做的是删除ArrayList的最后一个索引,然后调用重新绘制()从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{
    
        }
    
    
    }   
    

    知道我需要做些什么来“刷新”整件事吗?我做错什么了吗?尝试了搜索,但没有找到任何内容。。。

    2 回复  |  直到 9 年前
        1
  •  3
  •   MadProgrammer    9 年前

    Graphics graphe = jPanel1.getGraphics(); 不是绘画应该如何工作,相反,你应该高估面板的 paintComponent 方法,并在中绘制点。

    看见 Painting in AWT and Swing Performing Custom Painting 了解有关Swing中绘画的更多详细信息

    相反,您的小组应该完成所有工作,管理 ArrayList 并对其进行喷漆。如果满足设计要求,父组件“可能”能够添加或删除点,但核心责任仍在面板上。

    避免在 paint 方法,它们应该尽可能快地运行。由于图像从未更改,因此只需加载一次(无论是在构造类时还是在首次需要图像时),然后继续使用相同的引用。

        2
  •  1
  •   FidelCasto    9 年前

    好的,现在效果很好。我必须按照你告诉我的方式来做。我创建了一个扩展jPanel的新类(如下)。然后在我的主窗体中,必须创建这个类的对象。每当用户单击时,它将调用此Drawing类对象,并将一个项目添加到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){
            ...
        }
    }
    

    所以,如果我想“撤消”,让我们假设我的“MyDrawingClass”对象名为“draw”。我可以这样做:draw.arrayListPointX.remove(draw.arrayListPointX.size()-1);并调用重新绘制();以显示剩余的点。

    感谢您的提示,谢谢!:)