我正在做一个个人项目,以提高我的Java技能。
我在那里做的是,我创建了3个JPanel(一个全局的JPanel,向该全局的2个)。
在其中之一(右)中,我想绘制块。这些块具有随机的高度,宽度和唯一的ID。
在我的一个Java类中,我创建了一个随机数的块。然后,我正在执行绘制这些块的功能,这就是问题所在。 首先,paintComponent函数执行两次,而我只希望它执行一次。
第二,我的块绘制得不太好..这是面板中20张块绘制的图片(要调试,我放置了固定数量的块)。我的窗户是900x700。
这是我的paintComponent函数,我试图看看我在哪里犯了一个错误,但是 我把头发拉下来。
答案 0 :(得分:0)
您的目标图片表示您基本上希望以行的形式呈现图像,即,如果图像不适合当前行,则可以开始新的行。因此,您需要跟踪x和y的偏移量以及行中最高块的高度。这意味着对于每个块,您都将执行以下操作(未经测试,但如果不是100%正确,则应进行一些调试):
//maximum width of a line
int maxWidth = 300;
//Space in pixels between the border as well as the blocks
int paddingX = 5;
int paddingY = 5;
//the offset for the next block
int offsetX = paddingX;
int offsetY = paddingY;
int currentLargestHeight = 0;
for( Block block : blocks ) {
//if the block doesn't fit into the "line" start a new one
//we assume an empty line always can take at least one block
if( block.getWidth() > (maxWidth - offsetX - paddingX) ) {
//advance down
offsetY += currentLargestHeight + paddingY;
//we have a new line so the current largest height is 0 again
currentLargestHeight = 0;
//start left again
offsetX = paddingX;
}
//render the block
g2.fillRect(offsetX, offsetY, block.getWidth(), block.getHeight());
offsetX += block.getWidth() + paddingX;
if( block.getHeight() > currentLargestHeight ) {
currentLargestHeight = block.getHeight();
}
}