gpt4 book ai didi

Java 不调用组件重载的 paintComponent 方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:28 26 4
gpt4 key购买 nike

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

这是在我的主要功能中创建面板的代码。

最后一 block 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();

马赛克面板类代码片段

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());
}

我在创建马赛克函数中调用了 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());该程序可以运行,但它会以可怕的闪光重新绘制,而且当我在演示 field 内的其他一些学生容易癫痫发作时,我不会支付医疗费用。

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

提前谢谢你。

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

然后是一个包含一堆 jpg 的目录,用于平铺它目前它很慢我仍然需要修复它 Google docs link to the java file

最佳答案

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

关于Java 不调用组件重载的 paintComponent 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com