Disegno in Java usando Canvas


Voglio disegnare nella tela di Java ma non riesco a farlo funzionare perché non so cosa sto facendo. Ecco il mio semplice codice:

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);
    }
}

Non appare nulla sulla finestra.

Sbaglio a pensare che la tela sia una carta e la grafica sia la mia matita? E 'cosi' che funziona?

Author: dpp, 2012-03-08

4 answers

Suggerimenti:

  • Non usare Canvas come non si dovrebbe mescolare AWT con componenti Swing inutilmente.
  • Invece usa un JPanel o JComponent.
  • Non ottenere l'oggetto Graphics chiamando getGraphics() su un componente poiché l'oggetto Graphics ottenuto sarà transitorio.
  • Disegna nel metodo paintComponent() di JPanel.
  • Tutto questo è ben spiegato in diversi tutorial che si trovano facilmente. Perché non leggerli prima di provare a indovinare questo roba?

Link chiave del tutorial:

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

Devi sovrascrivere il metodo paint(Graphics g) della tua tela ed eseguire il tuo disegno lì. Vedere la documentazione di paint ().

Come afferma, l'operazione predefinita è cancellare la tela, quindi la chiamata all'oggetto grafico della tela non funziona come ci si aspetterebbe.

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

Perché il primo modo non dovrebbe funzionare. Viene creato l'oggetto Canvas e viene impostata la dimensione e vengono impostati i grahpics. Lo trovo sempre strano. Inoltre, se una classe estende JComponent, è possibile sovrascrivere

paintComponent(){
  super...
}

E quindi non dovresti essere in grado di creare e istanza della classe all'interno di un'altra classe e quindi chiamare NewlycreateinstanceOfAnyClass.repaint();

Ho provato questo approccio per alcuni giochi di programmazione che ho lavorato e non sembra funzionare nel modo in cui penso che dovrebbe essere.

Doug Hauf

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

Dovrebbe funzionare quanto segue:

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