繁体   English   中英

Java没有调用组件的重载paintComponent方法

[英]Java not calling component's overloaded paintComponent method

首先,这是创建马赛克图像生成器的家庭作业的一部分。 我希望程序在找到图像时实时重新绘制,并将其放在另一个图像上(源图像)。

这是在我的main函数中创建面板的代码。

最后一块mypanel.create()是镶嵌逻辑。

myPanel = new mosiacPanel(sourceFile, sizePercent, pixesize,threads, imageList);
//test.setText(Integer.toString(myPanel.getWidth()));
JFrame frame2 = new JFrame("COS 226 MOSIAC OF AWESOMENESS BY SLUIPMOORD && ELEANORASAURUSS");
myPanel.setVisible( true );
myPanel.repaint();
frame2.add(myPanel);
if(myPanel.getWidth() > menubar.getWidth()){
    frame2.setSize(myPanel.getWidth() , myPanel.getHeight() + menubar.getHeight() );
    frame2.repaint();
} else {
    frame2.setSize(menubar.getWidth() , myPanel.getHeight() + menubar.getHeight() );
}
frame2.setVisible( true );
//  myPanel.setLocation(170, 4);
myPanel.create();

Mosaic面板类代码片段

public void create()
{
    ph.createMosiac(imgUrls, this);
}

@Override
protected void paintComponent( Graphics g ) 
{  super.paintComponent(g); 
   g.drawImage( imgToPaint, 0, 0, null );
   // System.out.println("paint");
}

public void paintTile( BufferedImage img ) 
{

    imgToPaint = img;        
    this.repaint();
    // this.paintComponent(this.getGraphics());
}

我在create Mosaic Function中调用了paintTile函数。

public void createMosiac(List<String> fileNames, mosiacPanel parent)
{
    ArrayList<TileImage> srcTiles = new ArrayList<TileImage>();

    for( int i = 0; i < fileNames.size(); i++ ) 
    {
        srcTiles.add( new TileImage( fileNames.get(i), tileSize ) );
    }

    for( int y = 0; y <= (this.getHeight() - tileSize); y += tileSize ) 
    {           
        for( int x = 0; x <= (this.getWidth() - tileSize); x += tileSize ) 
        {
            int location = 0;
            double  dist, high = 2147483647;
            for( int i = 0; i < srcTiles.size(); i++ ) 
            {
                dist = this.getTileImage(x, y).differance( srcTiles.get(i) );

                if( (dist < high) )
                {
                    high = dist;
                    location = i;
                }                       
            }

            this.setTileImage( x, y, srcTiles.get(location) );
            parent.paintTile(this);                   
        }            
    }                        
}

那是我的程序逻辑。 当我在第二个片段// this.paintComponent(this.getGraphics())中取消注释时; 程序工作,但它重新闪现了一个可怕的闪光,我不是一个医疗账单,当我在演示场地内的一些其他学生容易发生癫痫发作。

如果我跟踪了paintComponent函数的跟踪,它会在程序结束时调用两次而不是每次重绘。

先感谢您。

我添加了一个你可以复制和运行的源代码。 选择要测试的图像,默认情况下目前不可用,因为你们没有它

然后一个包含一堆jpg的目录用它来平铺它现在还很慢我还需要修复那个Google文档链接到java文件

尝试在另一个线程中重新绘制。 也许这将解决你的问题。 祝好运! :)

暂无
暂无

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

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