java multi class paint

#java #multithreading #graphics #paint

#java #многопоточность #графика #Краски

Вопрос:

Я работаю в проекте с графикой, где на данный момент у меня есть 2 разных класса с графикой в каждом. В обоих классах вызывается paint(Graphics g) метод, но когда я его выполняю, оба JFrames метода мерцают.

Мой вопрос: правильно ли вызывать всю графику проекта в одном классе или требуются новые потоки для каждого класса?

Заранее благодарю вас.


Фрагменты кода

 public void paint(Graphics g) 
{ 
    repaint(); 
    mapLimits();
    moveEnemy();
    g.drawImage(background, 0,0, null); // draw background 
    drawImage(g, myHero, heroXposition, heroYposition, "name"); // draw hero 
    repaint(); 
}
  

а для класса inventory метод paint выглядит следующим образом

 public void paint(Graphics g) 
{ 
    g.drawImage(background, 0,0,null); //background 
    repaint(); 
} 
  

и оба они вызываются в основном классе

 Hero hero = new Hero(); 
hero.setVisible(true); 
Inventory inv = new Inventory(); 
inv.setVisible();
  

Комментарии:

1. Ваш вопрос, как указано, чрезвычайно расплывчатый. Хотите поделиться некоторым кодом и указать на что-то конкретное, что не работает?

2. Конечно. первый класс называется map, где методом paint является public void paint(Graphics g) { repaint(); mapLimits(); moveEnemy(); g.drawImage(background, 0,0, null); // нарисовать фоновое изображение drawImage(g, myHero, heroXposition, heroYposition, «name»); // нарисовать героя repaint(); а для класса inventory метод paint выглядит следующим образом public void paint(Graphics g) { g.drawImage( background, 0,0,null); //background repaint(); } и оба они вызываются в главном классе Hero hero = новый Герой(); hero.setVisible(true); Inventory inv = новый инвентарь(); inv.setVisible();

3. Добавьте «некоторый код» и описания кода в форму комментария, опубликуйте SSCCE . Единственное, что сказал бы мне SSCCE, это родительский класс map и должен ли он реализовываться paint(Graphics) или paintComponent(Graphics) . Кстати — имена классов должны быть EachWordUpperCase .

4. Никогда не вызывайте repaint() изнутри paint(Graphics) ! Кажется, вы пытаетесь «кодировать с помощью магии» — это не сработает.

5. да, но если я не вызываю repaint() из paint(графика), изображения не обновляются (положение на экране или анимация), если я не сверну и повторно не открою JFrame.

Ответ №1:

Ответ не имеет ничего общего с Thread (или, скорее, использование потоков для этого не решит проблем, которые уже есть в коде). Все сводится к пользовательскому рисованию и правильному его выполнению.

Подробнее смотрите урок по выполнению пользовательского рисования в руководстве по Java.

Вот некоторые общие советы:

  • Никогда не переопределяйте paint(Graphics) в контейнере верхнего уровня. Как только вы это сделаете, вы обнаружите, что пользовательский рендеринг может быть лучше показан в JDialog , JInternalFrame (и т.д.), А не в том, в чем вы его закодировали.
  • Вместо этого расширьте одно из JComponent или JPanel . Первый предназначен для полностью пользовательского рисования, второй — для объединения пользовательского рисования с другими компонентами. В любом из этих классов переопределите paintComponent(Graphics) вместо paint(Graphics) .
  • Используйте общую номенклатуру для имен классов и методов. Классы EachWordUpperCase , методы и атрибуты firstWordLowerCase , константы ALL_UPPER_CASE . Это особенно важно, если кто-либо, кроме вас, когда-либо прочитает код. Другие программисты используют регистр имен для предоставления подсказок относительно их природы / источника.
  • Не вызывайте repaint() изнутри ни paint(Graphics) , ни paintComponent(Graphics) .

Комментарии:

1. большое спасибо за ваши предложения. Что касается названия класса, я написал так по ошибке. В любом случае я прочитаю руководство, и если моя проблема будет решена, я приму этот ответ. Спасибо