2015-05-03 3 views
0

Извините, Im более новый на этом сайте, но у меня есть проблема с моим кодом, Im рисует набор изображений на JPanel, поэтому я переопределяю метод рисования, но когда я запускаю проект, Кажется, он работает дважды .. потому что я попытался поместить println, и его дважды появляется на выходе. Пожалуйста, подсказка :(Override paint() работает дважды

public class PanelDibujo extends JPanel { 

String cadenaOficial; 

public PanelDibujo(String cad){ 
    cadenaOficial=cad; 
} 

@Override 
public void paint(Graphics a){ 
    Toolkit t=Toolkit.getDefaultToolkit(); 
    Image imagen=t.getImage("imagenes/muro.jpg"); 
    g.drawImage(imagen, 20, 20, this); 
    System.out.println(cadenaOficial); 
    } 
} 

Я создал панель из этого кадра:.

public class VentanaPrincipal extends JFrame{ 

public VentanaPrincipal() { 
    PanelDibujo panel= new PanelDibujo(cadenaOficial); 
    setLocation(300, 10); 
    setDefaultCloseOperation(3); 
    setSize(660, 700); 
    add(panel); 
    } 
} 
+0

Возможно, вы дважды вызываете эту панель? – SMA

+0

где код, который запускает/использует этот класс? – RST

+0

Я обновил, извините! –

ответ

2
  • Первое правило Swing, вы не контролируете процесс окраски. Живопись будет происходить, когда система решит, что это нужно сделать, это называется пассивной живописью. Вы можете вносить предложения в систему о том, что перекраска должна произойти, но это зависит от системы, чтобы решить, что и когда это может произойти.
  • Не переопределяйте paint, переопределите paintComponent и не забудьте позвонить по телефону super.paintComponent, прежде чем выполнять какую-либо обычную картину , Картина выполняется с помощью серии цепочечных вызовов, это очень легко разбить эту цепочку и в конечном итоге без конца странных артефактов. Обычная конвенция рекомендует вместо этого заменить paintComponent, так как это, как правило, более безопасное место для выполнения живописи.
  • Не загружайте ресурсы и не выполняйте длительные операции в рамках любого метода рисования, этот WILL замедляет ваши регенерации, а живопись должна выполняться так же быстро, как возможно
  • Картина должна отображать текущее состояние компонента и должна избегать любых вычислений и иметь небольшую логику внутри. Решения о том, как должно быть изменено состояние, должны выполняться извне (например, через сеттеры), которые затем запускают repaint компонент

См. Painting in AWT and Swing и Performing Custom Painting для получения дополнительной информации о покраске

+0

Спасибо большое, я сделал это, пытаясь закончить быстрее, потому что это просто показать небольшой процесс, но он усложнился, я буду следовать правильному пути сейчас. –

0

Метод paint вызывается JVM, когда пользовательский интерфейс требует, чтобы перерисовать Это ответственность виртуальной машины Java Как и при сведении к минимуму окна, а затем максимизируйте его, вызывается метод paint.

Я бы предположил, что вы сначала скроете окно, а затем снова увеличьте его, вы снова обнаружите, что результат снова печатается.

+0

Понял, некоторое предложение пожалуйста? Мне нужно запустить только один раз :( –

+0

@JoaoSanchez, в чем проблема, с которой вы сталкиваетесь из-за множества вызовов 'paint'? – Blip

+0

Что я делаю ничью, набор изображений, а затем с таймером, движущимся вокруг одного имиджа, и он делает дважды, так что все заканчивается как катастрофа: /! –

Смежные вопросы