PaintComponent выполняется дважды и ошибка рисования - PullRequest
0 голосов
/ 29 ноября 2018

Я делаю небольшой личный проект, чтобы улучшить свой навык Java.

Что я там делаю, так это то, что я создаю 3 JPanel (глобальный и 2 в глобальный).

В одном из них (правильный) я хочу рисовать блоки,Эти блоки имеют произвольную высоту, ширину и уникальный идентификатор.

В одном из моих классов Java я создаю случайное количество блоков.Затем я делаю функцию для рисования этих блоков, и вот проблемы.Прежде всего, функция paintComponent выполняется дважды, и я хочу, чтобы она выполнялась только один раз.

Во-вторых, мои блоки ... не очень хорошо рисуют ... вот картинка, на которой 20 блоков рисуют в моей панели (для отладки я поставил фиксированное количество блоков).У меня окна 900x700.

Вот моя функция paintComponent, я пытался увидеть, где я допустил ошибку, но я стаскиваю волосы ..

1 Ответ

0 голосов
/ 29 ноября 2018

Ваше целевое изображение указывает, что вы в основном хотите визуализировать изображения в строках, то есть, если изображение не помещается в текущую строку, вы начинаете новую.Таким образом, вам необходимо отслеживать смещения для 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...