web-dev-qa-db-fra.com

Dessiner en Java en utilisant 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 Canvas est un papier et Graphics est mon crayon? Est-ce ainsi que cela fonctionne?

13
dpp

Suggestions:

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

Liens clés du didacticiel:

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

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

7
Tom G

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

paintComponent(){
  super...
}

et puis 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 jeu sur lesquels j'ai travaillé et cela ne semble pas fonctionner comme je le pense.

Doug Hauf

1
doug hauf

Les éléments suivants devraient 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
Llewv