Как сделать анимацию апплета? - PullRequest
0 голосов
/ 24 февраля 2010

Я пытаюсь сделать апплет для массива, включая операции вставки / удаления / поиска.

Для вставки и удаления это просто: как только пользователь нажмет кнопку «вставить» или «удалить», просто обновите массив и вызовите repaint, чтобы перерисовать массив.
Однако поиск отличается, это анимация, после нажатия кнопки поиска, я хочу начать с первого элемента в массиве, чтобы проверить значение, выделив этот элемент. У меня был код, показанный ниже, но он только подсвечивает элемент на последнем шаге (когда элемент найден), он не подсвечивает каждый элемент, как я ожидал, я не совсем знаком с анимацией апплета, любой может Помогите? Спасибо.

// index for search.
private searchIndex = -1;

 public boolean  search(int number) {
  boolean found = false;

  for (int i = 0; i < arr.getSize(); i++) {
   searchIndex = i;

   repaint();
   revalidate();

   if (arr.getElement(i) == number) {
    found = true;
    break;
   }

   try {
    Thread.sleep(3000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }

  return found;
 }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);       
        Graphics2D g2;
        g2 = (Graphics2D) g;
        g2.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING, 
                RenderingHints.VALUE_ANTIALIAS_ON);

        int xPos = START_X, yPos = START_Y;
        int width = CELL_WIDTH, height = CELL_HEIGHT;

        Font font = new Font("Serif", Font.BOLD, 12);
        g2.setFont(font);

        // draw array
        for(int i = 0; i < arr.getSize(); i++) {
 int element = arr.getElement(i);

 g2.setColor(Color.BLUE);
 g2.drawString(Integer.toString(element), xPos + OFFSET - 5, yPos + OFFSET + 5);

 g2.setColor(Color.BLACK);
 g2.drawRect(xPos, yPos, width, height);

 xPos += width;   
        }

        // high light the cell
         if (searchIndex > -1) {  
  xPos = START_X + (runSearch * CELL_WIDTH);

  g2.setColor(Color.blue);
  g2.fillRect(xPos, yPos, width, height);

  g2.setColor(Color.white);
  g2.drawString(Integer.toString(arr.getElement(searchIndex)), xPos + OFFSET - 5, yPos + OFFSET + 5);
 }

    }

1 Ответ

0 голосов
/ 24 февраля 2010

Поскольку Thread.sleep () приводит к тому, что EDT переходит в спящий режим, это означает, что графический интерфейс не может перерисовываться, пока цикл не завершится. Вместо этого вы должны использовать Swing Timer, поэтому запланируйте анимацию.

Прочитайте учебник Swing . Начните с разделов «Параллелизм» (чтобы понять, как работает EDT) и «Как использовать таймеры».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...