Dessin en Java à l'aide de Canvas


Je veux dessiner dans le Canevas de Java mais je ne peux pas le faire fonctionner parce que je ne sais pas ce que je fais. Voici mon code simple:

import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;

public class Program
{
    public static void main(String[] args)
    {
        JFrame frmMain = new JFrame();
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setSize(400, 400);

        Canvas cnvs = new Canvas();
        cnvs.setSize(400, 400);

        frmMain.add(cnvs);
        frmMain.setVisible(true);

        Graphics g = cnvs.getGraphics();
        g.setColor(new Color(255, 0, 0));
        g.drawString("Hello", 200, 200);
    }
}

Rien n'apparaît sur la fenêtre.

Ai-je tort de penser que la Toile est un papier et que les graphiques sont mon Crayon? Est-ce qu'il fonctionne?

Author: dpp, 2012-03-08

4 answers

Suggestions:

  • N'utilisez pas Canvas car vous ne devriez pas mélanger AWT avec des composants Swing inutilement.
  • Utilisez plutôt un JPanel ou un JComponent.
  • N'obtenez pas votre objet graphique en appelant getGraphics() sur un composant car l'objet graphique obtenu sera transitoire.
  • Dessiner dans la méthode paintComponent() de JPanel.
  • Tout cela est bien expliqué dans plusieurs tutoriels faciles à trouver. Pourquoi ne pas lire avant d'essayer de deviner ce des trucs?

Liens du tutoriel clé:

 33
Author: Hovercraft Full Of Eels, 2013-11-21 13:34:13

Vous devez remplacer la méthode paint(Graphics g) de votre Canevas et y effectuer votre dessin. Voir la documentation paint ().

Comme il l'indique, l'opération par défaut est d'effacer le canevas, de sorte que votre appel à l'objet graphique du canevas ne fonctionne pas comme prévu.

 7
Author: Tom G, 2012-03-08 04:17:48

Pourquoi la première façon ne fonctionnerait pas. L'objet Canvas est créé et la taille est définie et les grahpics sont définis. Je trouve ça toujours étrange. De plus, si une classe étend JComponent, vous pouvez remplacer le

paintComponent(){
  super...
}

Et alors ne devriez-vous pas être en mesure de créer et d'instance de la classe à l'intérieur d'une autre classe, puis appelez simplement NewlycreateinstanceOfAnyClass.repaint();

J'ai essayé cette approche pour certains programmes de jeux que j'ai travaillés et cela ne semble pas fonctionner comme je pense que cela devrait être.

Doug Hauf

 1
Author: doug hauf, 2013-09-06 16:07:58

Ce qui suit devrait fonctionner:

public static void main(String[] args)
{
    final String title = "Test Window";
    final int width = 1200;
    final int height = width / 16 * 9;

    //Creating the frame.
    JFrame frame = new JFrame(title);

    frame.setSize(width, height);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);

    //Creating the canvas.
    Canvas canvas = new Canvas();

    canvas.setSize(width, height);
    canvas.setBackground(Color.BLACK);
    canvas.setVisible(true);
    canvas.setFocusable(false);


    //Putting it all together.
    frame.add(canvas);

    canvas.createBufferStrategy(3);

    boolean running = true;

    BufferStrategy bufferStrategy;
    Graphics graphics;

    while (running) {
        bufferStrategy = canvas.getBufferStrategy();
        graphics = bufferStrategy.getDrawGraphics();
        graphics.clearRect(0, 0, width, height);

        graphics.setColor(Color.GREEN);
        graphics.drawString("This is some text placed in the top left corner.", 5, 15);

        bufferStrategy.show();
        graphics.dispose();
    }
}
 1
Author: Llewv, 2016-06-06 05:13:34