繁体   English   中英

覆盖油漆(图形g)Java

[英]Override paint(graphics g) Java

我在NetBeans中的GUI有点问题。 当用户在JPanel中的鼠标clic位置单击时,会绘制图像(点)。 这部分工作正常。 我将每个图像位置存储在两个不同的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{

    }


}   

知道我需要对某种“刷新”整个内容执行什么操作吗? 难道我做错了什么? 尝试搜索有关内容,但未发现任何问题...

Graphics graphe = jPanel1.getGraphics(); 不是绘画应该如何工作,而是应该重写面板的paintComponent方法并在其中绘制点。

有关绘画如何在Swing中工作的更多详细信息,请参见AWT中的绘画和Swing执行自定义绘画

相反,您的面板应该执行所有工作,管理ArrayList的点并绘制它们。 如果满足您的设计要求,您的父组件“可能”可以添加或删除点,但是面板的核心职责仍然是。

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

好吧,现在效果很好。 我必须按照你在这里告诉我的方式去做。 我创建了一个扩展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.arrayListPointX.remove(draw.arrayListPointX.size()-1); 并调用repaint(); 显示剩余点数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM