utilizando una tutorial setstroke rectangulo programa linea java2d hacer grosor estrella español cómo crea como clase java swing graphics graphics2d

una - rectangulo en java2d



Pintar una imagen usando Graphics2D (1)

Tu código está lleno de problemas:

  1. No anule JFrame.paint() , especialmente si no llama a super . Establezca un Panel de contenido y anule su paintComponent() . Si bien puede parecer conveniente, por lo general es un mal diseño e innecesario.
  2. No anule JComponent.paint() , sino que anule JComponent.paintComponent() (y llame a super )
  3. Use un JLabel para mostrar una imagen. Es mucho más simple.
  4. No mezcle AWT (Canvas) y Swing (JFrame). Stick a Swing.

Aquí hay un ejemplo simple que muestra un Bowser moviéndose alrededor del marco. (Es divertido cuando reduces el tamaño del marco y golpeas la imagen con el borde del marco ;-))

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.MalformedURLException; import java.net.URL; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.UnsupportedLookAndFeelException; public class TestAnimation2 { private static final int NB_OF_IMAGES_PER_SECOND = 50; private static final int WIDTH = 800; private static final int HEIGHT = 600; private Random random = new Random(); private double dx; private double dy; private double x = WIDTH / 2; private double y = HEIGHT / 2; protected void initUI() throws MalformedURLException { final JFrame frame = new JFrame(TestAnimation2.class.getSimpleName()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(null); final JLabel label = new JLabel(new ImageIcon(new URL("http://www.lemondedemario.fr/images/dossier/bowser/bowser.png"))); label.setSize(label.getPreferredSize()); frame.setMinimumSize(label.getPreferredSize()); frame.add(label); frame.setSize(WIDTH, HEIGHT); dx = getNextSpeed(); dy = getNextSpeed(); Timer t = new Timer(1000 / NB_OF_IMAGES_PER_SECOND, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { x += dx; y += dy; if (x + label.getWidth() > frame.getContentPane().getWidth()) { x = frame.getContentPane().getWidth() - label.getWidth(); dx = -getNextSpeed(); } else if (x < 0) { x = 0; dx = getNextSpeed(); } if (y + label.getHeight() > frame.getContentPane().getHeight()) { y = frame.getContentPane().getHeight() - label.getHeight(); dy = -getNextSpeed(); } else if (y < 0) { y = 0; dy = getNextSpeed(); } label.setLocation((int) x, (int) y); } }); frame.setVisible(true); t.start(); } private double getNextSpeed() { return 2 * Math.PI * (0.5 + random.nextDouble()); } public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { new TestAnimation2().initUI(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } }

Estoy tratando de obtener una imagen para pintar en la pantalla usando Graphics2D de Java. Aquí está el código que estoy usando. Quiero ver una imagen moverse constantemente a través de la pantalla. En este momento puedo ver la imagen, pero no se mueve a menos que cambie el tamaño de la ventana, en cuyo caso SÍ se mueve. He esbozado las clases a continuación.

public class Tester extends JFrame { private static final long serialVersionUID = -3179467003801103750L; private Component myComponent; public static final int ONE_SECOND = 1000; public static final int FRAMES_PER_SECOND = 20; private Timer myTimer; public Tester (Component component, String title) { super(title); myComponent = component; } public void start () { myTimer = new Timer(ONE_SECOND / FRAMES_PER_SECOND, new ActionListener() { @Override public void actionPerformed (ActionEvent e) { repaint(); } }); myTimer.start(); } @Override public void paint (Graphics pen) { if (myComponent != null) { myComponent.paint(pen); } } }

El objeto Componente pasado a Tester es la siguiente clase:

public class LevelBoard extends Canvas implements ISavable { private static final long serialVersionUID = -3528519211577278934L; @Override public void paint (Graphics pen) { for (Sprite s : mySprites) { s.paint((Graphics2D) pen); } } protected void add (Sprite sprite) { mySprites.add(sprite); }

Me he asegurado de que esta clase tenga solo un sprite que he agregado. La clase de sprites es aproximadamente la siguiente:

public class Sprite { private Image myImage; private int myX, myY; public Sprite () { URL path = getClass().getResource("/images/Bowser.png"); ImageIcon img = new ImageIcon(path); myImage = img.getImage(); } public void update () { myX += 5; myY += 5; } public void paint (Graphics2D pen) { update(); pen.drawImage(myImage, myX, myY,null); }

Sin embargo, veo solo una imagen estacionaria de bowser en la pantalla. Él no se mueve a menos que la ventana cambie de tamaño. Sé que el método de pintura (Graphics2D pen) en la clase Sprite se llama a intervalos particulares (debido al temporizador en la clase Tester). Sin embargo, a pesar de que las posiciones xey se incrementan en 5 cada vez. El sprite no se mueve. Por qué no? ¿Cómo lo arreglo? Solo estoy tratando de probar algunas otras características de mi programa en este momento, así que realmente solo necesito poner esto en funcionamiento. Realmente no me importa cómo.