#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. большое спасибо за ваши предложения. Что касается названия класса, я написал так по ошибке. В любом случае я прочитаю руководство, и если моя проблема будет решена, я приму этот ответ. Спасибо