paintComponent执行两次,绘制失败

时间:2018-11-29 12:33:11

标签: java eclipse swing

我正在做一个个人项目,以提高我的Java技能。

我在那里做的是,我创建了3个JPanel(一个全局的JPanel,向该全局的2个)。

在其中之一(右)中,我想绘制块。这些块具有随机的高度,宽度和唯一的ID。

在我的一个Java类中,我创建了一个随机数的块。然后,我正在执行绘制这些块的功能,这就是问题所在。 首先,paintComponent函数执行两次,而我只希望它执行一次。

第二,我的块绘制得不太好..这是面板中20张块绘制的图片(要调试,我放置了固定数量的块)。我的窗户是900x700。

这是我的paintComponent函数,我试图看看我在哪里犯了一个错误,但是 我把头发拉下来。

1 个答案:

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