Подумайте об использовании AffineTransform, чтобы выполнить ротацию, и сделайте это в Swing Timer. Затем используйте это в своем методе paintComponent, чтобы повернуть треугольный Shape
, который может быть вашим объектом GeneralPath (хотя я бы объявил переменную GeneralPath в классе, а не в paintComponent).
Что касается вашего звонка на перерисовку:
public void paintComponent( Graphics g )
{
repaint(); // call superclass's paintComponent
Вы понимаете, что это не делает ничего подобного, и что если бы Swing не был достаточно умен, это вызвало бы бесконечную рекурсию и заблокировало бы вашу программу. Как упоминал Джеймс, для этого поведения вызовите метод superC paintComponent.
Редактировать 1:
Кроме того, вы, вероятно, захотите использовать привязки клавиш вместо KeyListener, поскольку это высокоуровневая конструкция и более гибкая в отношении фокуса - KeyListener будет работать, только если компонент, который прослушивается, имеет фокус , не так с привязками клавиш, если настроен правильно.
Редактировать 2:
ОК, это сработало для меня:
- Сделайте звездочку переменной Path2D, а затем снова полем класса и инициализируйте его массивами int [] для значений x и y.
- Создайте переменную Swing Timer, которую я назвал rotateTimer, и сделайте ее полем класса
- Используйте метод Path2D
transform(AffineTransform at)
и AffineTransform.getTranslateInstance (tx, ty), чтобы центрировать ваш треугольник на JPanel.
- Используйте две привязки клавиш для привязки к ключу KeyEvent.VK_R. Я бы использовал метод KeyStroke.getKeyStroke, который принимает 2 дюйма и логическое значение для привязки как к нажатой, так и к отпусканной клавише.
- В AbstractAction для нажатой клавиши (onKeyRelease - false) запустите () ваш таймер
- А в AbstractAction для ключа выпущено (onKeyRelease - true) остановите () ваш таймер
- В Swing Timer метод actionPerformed ActionListener снова вызывает
star.transform(AffineTransform at)
, но на этот раз используйте AffineTransform.getRotateInstance(BASE_THETA, anchorx, anchory)
, что занимает 3 двойных, чтобы вы могли сказать ему, как далеко повернуть и центрировать ось вращения вокруг вашей звезды.
- В paintComponent все, что вам нужно сделать, это привести Graphics к Graphics2D и использовать объект Graphics2D, чтобы установить RenderingHints так, чтобы сглаживание было включено, установить цвет вашей звезды и нарисовать звезду, вот и все.