2015-06-12 4 views
1

У меня есть эта программа, где у меня есть холст в окне с двумя кругами в нем (вы можете переместить один из кругов, нажав на холст).Java repaint обновляет только часть моего Canvas

Он работает без проблем на окнах и прошивке, но она имеет эту проблему на убунту:

Когда я изменить выбранный круг выпадающего списка в верхнем левом углу окна, круги исчезают и только видимый в верхнем левом углу холста в области, которая была покрыта элементами списков, прямо перед тем, как я поместил выбранный круг.

Также, когда я перетаскиваю окно приложения, чтобы оно покидало экран или помещало другое окно над моим окном, круги становятся видимыми в той части холста, которая была скрыта.

Не могли бы вы объяснить, почему это происходит и что я делаю неправильно?

код моей программы здесь: http://pastie.org/private/rm0gw2awx6d7iztyabzs7q

+0

Может быть, это потому, что я использовал холст вместо JPanel. Но когда я делаю это JPanel, он начинает делать сумасшедшие вещи, когда я перемещаю круг. – dannymo

+0

Работает на iOS, это отличный подвиг – MadProgrammer

+0

Вы нарушаете цепочку рисования, вы должны называть super.paint, но в случае JPanel вы должны переопределять paintComponent (и вызов super.paintComponent) – MadProgrammer

ответ

1

Вы нарушаете краски цепь, вы должны называть super.paint, но в случае JPanel, вы должны быть переопределение paintComponent (и вызов super.paintComponent перед вами делать какие-либо пользовательские картины)

Взгляните на Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации

0

трудно давать какие-либо мысли (кусок кода не хватает). В моей системе (Cinnamon 2.4.8) все красиво окрашено. Во всяком случае, добавление super.paint() не требует больших усилий и ничего не повредит.

Интересно следующее: вы создаете свой кадр непосредственно в методе main(). Но в настоящее время Swing/AWT основная рама должна быть создана в очереди событий:

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new BlochovyKruhy2(); 
     } 
    }); 
} 

вместо

public static void main(String[] args) { 
    new BlochovyKruhy2(); 
} 
Смежные вопросы