Любые предложения о том, почему треугольник не вращается, когда я нажимаю клавишу? - PullRequest
0 голосов
/ 16 октября 2011

Я ищу ответ, почему треугольник не вращается при нажатии клавиши.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.GeneralPath;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Beta extends JPanel implements KeyListener
{
    private static final long serialVersionUID = 1L;
    private int LEFT = 0, RIGHT = 1;

    Beta()
    {
        addKeyListener(this);
    }

    public void paintComponent( Graphics g )
    {
        repaint(); // call superclass's paintComponent

точки треугольника

        int[] xPoints = {-50, 0, 50};
        int[] yPoints = {0, -50, 0};

        Graphics2D g2d = ( Graphics2D ) g;
        GeneralPath star = new GeneralPath(); // create GeneralPath object

        // set the initial coordinate of the General Path
        star.moveTo(-50, 0);

        // create the star--this does not draw the star
        for ( int count = 1; count < xPoints.length; count++ )
          star.lineTo( xPoints[ count ], yPoints[ count ] );

        star.closePath(); // close the shape

        g2d.translate( getWidth()/2, getHeight()/2 ); // translate the origin to (150, 150)

        // rotate around origin and draw stars in random colors

вращение

        g2d.rotate( Math.PI / 40.0 );

        g2d.setColor(Color.RED);

        g2d.fill( star );
    }

@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}

нажмите клавишу для рисования

public void keyPressed(KeyEvent ke)
{
    switch(ke.getKeyCode())
    {   
        default: repaint();
    }
}

@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

}

    public static void main( String[] args )
    {
        JFrame frame = new JFrame( "Space Battle Beta" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

            //add Panel to frame
        Beta shapes2JPanel = new Beta(); 
        frame.add( shapes2JPanel ); // add shapes2JPanel to frame
        frame.setBackground(Color.BLACK);
        frame.setSize( 315, 330 ); // set frame size
        frame.setVisible( true ); // display frame
    }
} // end class Shapes2JPanel

Невозможно повернуть треугольник.repaint() не работает или это что-то еще?

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Подумайте об использовании 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 так, чтобы сглаживание было включено, установить цвет вашей звезды и нарисовать звезду, вот и все.
3 голосов
/ 16 октября 2011

repaint () не будет вызывать метод рисования суперкласса, он будет вызывать метод этого класса.Вы должны сделать super.paintComponent(g) для вызова paintComponent () суперкласса вместо repaint()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...